2012-03-11 13 views
2

フォームセットのフィールドの順序を保存したいが、注文フィールドを非表示にする(ユーザーが編集できないようにする)。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です。ページから実際の番号を取得するにはどうすればよいですか? –

+0

さらに、 '' order''を 'forms.formsets.ORDERING_FIELD_NAME'に変更してください –

0

をあなたが実際に(あなたの例を使用して)これを行うことができます:あなたがform引数を使用する場合

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

しかし、これは、フォーム内に含まれる任意の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 
関連する問題