2014-10-04 51 views
0

我正在使用Django(v1.7),我正在尋找一種「Django風格」的方式來選擇要在generic.ListView中顯示的字段。如何選擇要在Django的通用ListView類中顯示的字段?

讓我提供了一個例子:

在models.py:

class Stuff(generic.models): 
    field1 = model.CharField() 
    field2 = model.CharField() 
    field3 = model.CharField() 

在views.py:

class StuffList(generic.ListView) 
    model = Stuff 

在模板/ stuff_index.html

{% for stuff in object_list %} 
    Field1: {{ stuff.field1 }} 
    Field3: {{ stuff.field3 }} 
{% endfor %} 

有沒有辦法在views.py中顯示要顯示的字段?這樣views.py和模板/ stuff_index.html看起來像:

views.py:

class StuffList(generic.ListView) 
    model = Stuff 
    fields = ['field1','field3']  # Or something similar 

在模板/ stuff_index.html

{% for stuff in object_list %} 
    {% for field in stuff %} 
     {{ field.name }}: {{ stuff.field }}  <!-- Or something similar --> 
    {% endfor %} 
{% endfor %} 

是編碼不知何故這樣處理由Django框架?通過在StuffList類中重新定義get_queryset()方法的返回值,我獲得了類似的結果,但它不是「智能」解決方案。

+0

如果您正在尋找正常的方式做,這是你所指定的第一種方式 - 就是不引用你不希望在您的模板,以顯示對象的部分。你有什麼理由在你看來寧願這樣做? – 2014-10-04 18:53:17

+0

實際上,我想要一個通用模板並使用它來呈現多個不同對象的列表。這樣看起來更像DRY:開發者很容易添加或刪除要顯示的字段。 但是你似乎是對的,我通過例子和互聯網找到的唯一方法是編碼要直接在模板中顯示的元素。 – Matt 2014-10-04 22:15:30

+0

最好不要以這種方式使用模板,因爲當您嘗試處理每個對象列表引入的特殊情況時,模板中會出現太多邏輯。相反,使用模板繼承讓你的模板幹掉。 – 2014-10-05 09:08:29

回答

0

我認爲get_context_data是你可能要找的東西。

https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-display/

+1

謝謝@ user4107395。這個例子提供了這個函數不能很好地解釋我正在尋找的用法。你可以用HOWTO的鏈接或教程或使用例子來擴展你的答案嗎? 再次感謝您。 – Matt 2014-10-04 22:22:37

+0

嗯,我想我知道你在做什麼。我又進行了一次快速搜索,並且遇到了以下可能會更接近的問題。 http://reinout.vanrees.org/weblog/2014/05/19/context.html – user4107395 2014-10-04 22:29:09

+0

嘿,是的,它越來越近!我從來沒有試過這樣使用TemplateView。解決方案可能是定義一個包含要在視圖類中顯示的字段的變量,並在遍歷字段的模板中使用* {%for foo in fooList%} *。我會試一試。謝謝! – Matt 2014-10-04 23:40:06

相關問題