用form包裹表格中的每个表格,包括带有django crispy形式的未提及的字段

时间:2013-06-29 18:37:45

标签: django django-crispy-forms formsets

我正在使用以下代码将表单中的表单的所有表单字段包装在一个带有django crispy表单的div中:

class OperatorForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(OperatorForm, self).__init__(*args, **kwargs):
            self.helper = FormHelper(self)
            self.helper.form_tag = False
            self.helper.all().wrap_together(Div, css_class="operator-form")
            self.helper.render_unmentioned_fields = True

    class Meta:
        model = Operator
        fields = tuple(fields_list)

使用'self'实例化FormHelper会自动生成布局,而无需指定所有字段。我需要这个,因为我的字段是动态生成的。问题是DELETE和ORDER字段未添加到布局中。所以我将render_untioned_fields设置为True。使用此设置,这两个字段至少会显示在表单中,但不会与div中的其余字段一起包装。

我知道我可以手动迭代formset中的表单并用div包装它们,这是我到目前为止所做的,但这需要手动处理formset的非表单错误,这是通常由脆皮自动完成。

编辑:根据要求更新了代码。这整个类实际上包含在一个填充fields_list的工厂方法中,因此我可以动态地只包含某些字段。 ORDER和DELETE是故意遗漏的。它们会被自动检测到(包括它们会导致错误)并在表单中显示,它们根本不包含在div中。

1 个答案:

答案 0 :(得分:0)

正如Brian Dant建议的那样,如果要将{ORER和DELETE包含在Layout中,则应手动添加ORDER和DELETE。我的问题是我也将它们传递给了Meta班的“字段”。

class _OperatorForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(_OperatorForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_tag = False
        self.helper.layout.extend(['ORDER', 'DELETE'])
        self.helper.all().wrap_together(Div, css_class="operator-form")

    class Meta:
        model = ApplicationOperator
        fields = tuple(fields_list)