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