Django脆皮形式__init__

时间:2012-12-19 10:52:15

标签: django django-forms django-crispy-forms

我刚刚开始使用松脆的形式,我注意到表格形式的描述有些不规则,以及它在路上有什么影响

来自github中的example,布局如下所述

class MessageForm(forms.Form):

    [...]

    # Uni-form
    helper = FormHelper()
    helper.form_class = 'form-horizontal'
    helper.layout = Layout(
        Field('text_input', css_class='input-xlarge'),
        Field('textarea', rows="3", css_class='input-xlarge'),
        'radio_buttons',
        Field('checkboxes', style="background: #FAFAFA; padding: 10px;"),
        AppendedText('appended_text', '.00'),
        PrependedText('prepended_text', '<input type="checkbox" checked="checked" value="" id="" name="">', active=True),
        PrependedText('prepended_text_two', '@'),
        'multicolon_select',
        FormActions(
            Submit('save_changes', 'Save changes', css_class="btn-primary"),
            Submit('cancel', 'Cancel'),
        )
    )

他们documentations

中的部分
class ExampleForm(forms.Form):
    [...]
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Fieldset(
                'first arg is the legend of the fieldset',
                'like_website',
                'favorite_number',
                'favorite_color',
                'favorite_food',
                'notes'
            ),
            ButtonHolder(
                Submit('submit', 'Submit', css_class='button white')
            )
        )
        super(ExampleForm, self).__init__(*args, **kwargs)

我很困惑地看到在文档中使用def __init__(self, *args, **kwargs):行作为示例。为什么在使用第一个示例中显示的方法简单定义表单时使用它。它们中的任何一个都会有任何好处/缺点吗?

1 个答案:

答案 0 :(得分:0)

__init__方法中执行此操作允许根据表单内容修改帮助程序(显示/隐藏按钮),直到呈现为止。

为了保持灵活性并减少帮助者的计算,我把它放在属性属性中。

这使我也可以为儿童表格提供自然独立的帮助。

在使用静态助手处理单个表单的简单情况下,您的方法很棒。否则,它可能是危险的。

我使用具有给定属性的mixin,这让我感觉更像是一个扩展形式的api:

class MyFormMixin
    @property
    def helper(self):
        helper = FormHelper()

        if hasattr(self, "parent_url"):
            back = layout.Button('back', 'Return button text')
            back.field_classes += ' primaryAction'
            helper.add_input(back)

        reset = layout.Reset('reset', 'undo')
        reset.field_classes += ' primaryAction'
        helper.add_input(reset)

        submit = layout.Submit('submit', 'Valider (here in french)')
        submit.field_classes += ' primaryAction'
        helper.add_input(submit)

        helper.form_method = 'POST'
        if hasattr(self, "action_url"):
            helper.form_action = self.action_url

        if hasattr(self, "form_style"):
            helper.form_style = self.form_style

        if hasattr(self, "form_layout"):
            fs=[]
            for name, fields in self.form_layout.iteritems():
                fs.append(layout.Fieldset(name, *fields))
            helper.add_layout(layout.Layout(*fs))
        else:
            helper.add_layout(layout.Layout(layout.Fieldset("",*self.fields.keys())))
        return helper

设置self.helper的__init__方法也可以完成这项工作。 (但有时我使用表单进行简单验证而不进行渲染,我将其设置在属性中。)

希望这有帮助