我有Model很多屬性;在我呈現的模板中,DetailView我只想顯示不是None.
這可以通過if檢查屬性值是否為 not 的模板標簽輕松完成,但None我應該為模型中的每個屬性添加一個 if 條件,而且有很多。
我想遍歷所有屬性并if not None顯示它們。在偽代碼中,它看起來像這樣:
{% for attribute in my_instance.all_attributes %}
{% if attribute.value is not None %}
{{attribute.value}}
我可以通過類或實體獲得一個具體屬性的元組:
cls._meta.concrete_fields
或者
self._meta.concrete_fields
現在my_instance.all_attributes我的偽代碼示例中有 ,我可以對其進行迭代,但我不知道如何獲取實體屬性的實際值。
編輯:
.concrete_values回傳一個實體陣列Field,它看起來像這樣:
(<django.db.models.fields.BooleanField: gov>, <django.db.models.fields.BooleanField: in_group>, <django.db.models.fields.CharField: legal_class>,)
Field我可以使用 訪問實體的名稱屬性的值.name。呼叫.name上面的示例將回傳'gov', 'in_group','legal_class'
uj5u.com熱心網友回復:
Django 的作者竭盡全力確保模板語言不用于做這樣的事情!據我了解,他們的意見是模板應該進行格式化,而 Python 應該進行程式邏輯。
有兩種解決方法。一種是創建模板可以迭代的結構,并將其傳遞給 DetailView 背景關系。就像是
def get_context_data(self):
data = super().get_context_data(**kwargs)
fieldnames = [
x.name for x in self.object._meta.concrete_fields ]
display_fields = [
(name, getattr( self.object, name, None)) for name in fieldnames ]
display_fields = [ x for x in display_fields if x[1] is not None ]
data['display_fields'] = display_fields
return data
在模板中你現在可以做
{% for name,value in display_fields %}
您可能更喜歡對名稱串列進行編碼而不是使用._meta.concrete_fields,因為這可以讓您選擇它們??出現的順序。或者,您可以從有序串列開始,并附加 _meta 中但尚未在串列中的任何內容(并洗掉串列中但不在 _meta 中的任何內容)
另一種方法是使用 Jinja 作為該視圖的模板引擎。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410971.html
標籤:
