保存Django Modelformset中的字段顺序

时间:2012-03-11 08:15:43

标签: django django-forms django-templates

我想保存formset中字段的顺序,但我想隐藏订单字段(即用户无法编辑它)。

文档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'我怀疑我的重写类不正确,但文档对我没什么帮助。

3 个答案:

答案 0 :(得分:2)

HiddenInput is a widget,而不是表单字段,请尝试:

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

答案 1 :(得分:2)

我在django.forms.models中进行了一些挖掘并将其复制出来。这就是我解决它的方法:

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

答案 2 :(得分:0)

你实际上可以这样做(使用你的例子):

Public Function PostValue(ByVal json as String)
    return json
End Function

但是,如果您使用MyFormSet = inlineformset_factory( ModelA, ModelB, formset=MyBaseFormSet, can_order=True, widgets={forms.formsets.ORDERING_FIELD_NAME: forms.HiddenInput()}, ) 参数Meta.widget,则会覆盖表单中包含的任何form设置。此外,订单字段稍后会添加到表单中,因此向订单字段的inlineformset_factory添加条目不会执行任何操作。所以,如果使用Meta.widget参数,那么这里已经提出的建议似乎是最好的:

form