2

我刚刚开始使用酥脆的表格,我注意到表格的描述方式存在一些不规则之处,以及它在未来会产生什么影响

从 github 中的示例中,布局描述如下

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'),
        )
    )

以及他们文档中的部分

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):文档中示例的 line 使用。当您可以使用第一个示例中显示的方法简单地定义表单时,为什么要使用它。它们中的任何一个都会有任何好处/缺点吗?

4

1 回答 1

1

在方法中这样做__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__方法也可能完成了这项工作。(但有时我使用表单进行简单验证而不进行渲染,因此我将其设置在一个属性中)。

希望这可以帮助

于 2012-12-19T14:51:49.977 回答