【问题标题】:Save order of fields in Django Modelformset在 Django Modelformset 中保存字段的顺序
【发布时间】:2012-03-11 08:15:43
【问题描述】:

我想在表单集中保存字段的顺序,但我希望隐藏顺序字段(即用户无法编辑它)。

文档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' 我怀疑我的覆盖类不正确,但文档对我没有多大帮助。

【问题讨论】:

    标签: django django-forms django-templates


    【解决方案1】:

    HiddenInput is a widget,不是表单域,所以试试:

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

    【讨论】:

    • 使用此解决方案,我必须将 ['order'] 更改为 ['ORDER'] 并正确呈现在页面上。但是,在我的 form.cleaned_data 中,ORDER 是 None。我如何从页面中获取实际数字?
    • 更好的是,将'order' 更改为forms.formsets.ORDERING_FIELD_NAME
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您实际上可以这样做(使用您的示例):

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

      但是,如果您使用 inlineformset_factoryform 参数,这将覆盖表单中包含的任何 Meta.widget 设置。此外,订单字段稍后会添加到表单中,因此将条目添加到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
      

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 2012-06-14
        • 2013-07-09
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多