2012-03-11 66 views
2

我想保存字段在一個formset中的順序,但我想隱藏順序字段(即用戶不能編輯它)。保存在Django中的字段順序Modelformset

文檔here說我可以重寫add_fields方法來重新定義訂單字段的屬性。這裏是我重寫類:

class MyBaseFormSet(BaseInlineFormSet): 
    def add_fields(self, form, index): 
     super(MyBaseFormSet, self).add_fields(form, index) 
     form.fields['order'] = forms.HiddenInput() 

而且從views.py:

MyFormSet = inlineformset_factory(ModelA, 
             ModelB, 
             formset = MyBaseFormSet, 
             can_order = True) 

我的模板文件的相關部分:

{{ formset.management_form }} 
<tr> 
{% for form in formset %} 
    {% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %} 
    <td>{% for visible in form.visible_fields %}{{ visible }}{% endfor %}</td> 
</tr> 

它呈現頁面時,提出了一個TemplateSyntaxError :Caught AttributeError while rendering: 'HiddenInput' object has no attribute 'label'我懷疑我的重寫類是不正確的,但文檔沒有多大幫助。

回答

2

我在做一些django.forms.models挖掘和複製了這一點吧。這是我如何解決它:

form.fields['ORDER'] = forms.IntegerField(label=(u'Order'), initial=index+1, required=False) 
    form.fields['ORDER'].widget = forms.HiddenInput() 
2

HiddenInput is a widget,而不是一個表單字段,所以嘗試:

form.fields['order'].widget = forms.HiddenInput() 
+0

使用該解決方案,我不得不改變[「秩序」]爲[「ORDER」]和它呈現在頁面上正確。但是,在我的form.cleaned_data中,ORDER是None。我如何從網頁中獲取實際的號碼? – 2012-03-11 18:35:31

+0

更好,然後將''order''改成'forms.formsets.ORDERING_FIELD_NAME' – 2017-12-20 15:58:22

0

實際上,你可以做到這一點(使用你的例子):

MyFormSet = inlineformset_factory(
    ModelA, 
    ModelB, 
    formset=MyBaseFormSet, 
    can_order=True, 
    widgets={forms.formsets.ORDERING_FIELD_NAME: forms.HiddenInput()}, 
) 

然而,這將覆蓋在表單中包含如果使用form參數任何Meta.widget設置inlineformset_factory。另外,訂單字段稍後添加到表單中,因此爲訂單字段添加條目Meta.widget什麼也不做。所以,如果使用form參數,那麼什麼是已經在這裏建議似乎是最好的:

class MyBaseFormSet(BaseInlineFormSet): 
    def add_fields(self, form, index): 
     super(MyBaseFormSet, self).add_fields(form, index) 
     try: 
      form.fields[forms.formsets.ORDERING_FIELD_NAME].widget = forms.HiddenInput() 
     except KeyError: 
      pass