【问题标题】:Django crispy form __init__Django 酥脆形式 __init__
【发布时间】:2012-12-06 16:57:55
【问题描述】:

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

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

【问题讨论】:

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


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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2019-03-17
      • 2013-04-23
      • 2014-10-11
      • 2018-01-16
      • 2015-02-18
      • 2014-12-28
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多