1

我在Django中有一個表單集。在Django中的模型表單中獲取數據

我打印此表單集的模板作爲

{% for form in formset %} 
    {{ form.name }} 
{% endfor %} 

的表單集由查詢集的形式和一些額外的形式。但我需要一些來自查詢集的字段值,我不會將其顯示爲表單。這怎麼可能?這是一個包含prefetch_related的查詢集,所以這些字段實際上並不在模型中,但是會加入到我的查詢集中。

我的模型

class Person: 
    name = CharField(max_length=200) 

class Grade: 
    person = ForeignKey(Person) 
    grade = IntegerField() 

我查詢集是Person.objects.prefetch_related('grade_set')

我的模板是

{% for form in formset %} 
    Object id: {{ obj.id }} 
    {{ form.name }} 
    {{ obj.grade_set.all|running_total }} 
{% endfor %} 

我知道obj沒有定義,但我認爲這也許將有可能做這樣的事情在模板:

{% for obj, form in object_formset %} 
    Object id: {{ obj.id }} 
    {{ form.name }} 
    {{ obj.grade_set.all|running_total }} 
{% endfor %} 

現在我的表單集只包含表單,但我需要一個對象列表並從該對象列表創建一些表單。我可以通過創建表單並使用字段名稱和輸入名稱來完成一些小操作,並完全避免了Django創建表單的方式,但我認爲這將是愚蠢的。必須有其他方式。

+0

請包括您所指的型號和形式;當它很抽象時,很難說出你正在引用的內容。 – sgarza62 2014-09-02 19:58:21

+0

另外,當你說「我需要查詢集中的一些字段值」時,你的意思是你在處理提交表單的視圖中需要它們嗎?或者在模板中? – sgarza62 2014-09-02 19:59:48

+1

我已更新我的問題 – Jamgreen 2014-09-03 07:19:33

回答

2

是的,這可以使用zip

# somewhere in views.py... 
people = Person.objects.prefetch_related('grade_set') 
formset = # ...(create your modelformset)... 
people_and_formset = zip(people, formset) 

# somewhere in template.html... 
{% for person, form in people_and_formset %} 
    {{ person.id }} 
    {{ form.name }} 
    {{ person.grade_set.all|running_total }} 
{% endfor %} 

曾使用prefetch_related,每個Persongrade_set將在查詢集緩存中找到,並且不需要另一個命中分貝。

+0

這太好了。問題是我使用django-extra-views中的'UpdateWithInlinesView',我不知道如何改變'get_context_data'中的內聯變量。你能幫我嗎?我已經瀏覽了https://github.com/AndrewIngram/django-extra-views/blob/master/extra_views/advanced.py中的代碼小時 – Jamgreen 2014-09-04 20:50:48

+0

我嘗試過很多不同的東西,但是我得到錯誤'zip argument# 2必須使用'kwargs ['obj_and_formset'] = zip(queryset,self.get_formset_class())''和'formset = zip(queryset,inlineformset_factory(self.model,self.get_inline_model(),** self.get_factory_kwargs ()))' – Jamgreen 2014-09-04 21:14:49

+0

@Jamgreen不幸的是,這是一個與你發佈的完全不同的問題,我對'django-extra-views'庫不熟悉。你也沒有顯示任何相關的代碼。你可能想開一個新的問題。 – sgarza62 2014-09-04 21:25:12