【问题标题】:How to use widgets in Django Crisp Forms如何在 Django Crisp Forms 中使用小部件
【发布时间】:2019-12-21 09:08:34
【问题描述】:

我正在使用 Django Crispy 表单及其 FormHelper。在我的 FormHelper 类中,我希望其中一个字段应该使用小部件。使用小部件的原因是我想在其中一个字段中填充日期选择器。

使用该字段,我可以通过识别 css_class 在我的 updated_date 中填充 DatePicker。但我想给 DatePicker 一个格式和主题(attrs)。我将如何做到这一点?

forms.py

class DeviceFilterFormHelper(FormHelper):
    # form_class = "form form-inline"

    form_id = "Device-search-form"
    form_method = "GET"
    form_tag = True
    html5_required = True
    layout = Layout(
        Div(
            Div('name', css_class="col-md-6"),
            Div('location', css_class="col-md-6"),
            css_class='row'
        ),
        Div(
            Div('phone_number', css_class="col-md-6"),
            Div(Field('updated_date', css_class="date-time-picker")),
            css_class='row'
            ),
        FormActions(
            Submit("submit", ("Search"), css_class="col-md-5"),
            css_class="col-8  text-right align-self-center",
        ),
    )

下面是我想在 FormHelper 中使用的小部件及其属性。

updated_date = forms.DateInput(attrs={
                                               'required': True,
                                               'class': 'date-time-picker',
                                               'data-options': '{"format":"Y-m-d H:i", "timepicker":"true"}'

                                           }),

我只是不知道我将如何使用这个小部件。

【问题讨论】:

    标签: jquery django django-forms django-crispy-forms django-widget


    【解决方案1】:

    我不相信您可以在基于 FormHelper 的类中执行此操作,而我通常做的是挂钩 form 类的 __init__ 方法,这就是我将对表单/布局/小部件等进行任何更改。这些方面的内容可能对您有用:

    class DeviceFilterFormHelper(FormHelper):
        ... # no changes to your class/code from above
    
    
    class DeviceFilterForm(forms.Form):
        def __init__(self, *args, **kwargs):
            super(DeviceFilterForm, self).__init__(*args, **kwargs)
            self.helper = DeviceFilterFormHelper(self)
            self.fields['updated_date'].widget = forms.DateInput(attrs={
                    'required': True,
                    'class': 'date-time-picker',
                    'data-options': '{"format":"Y-m-d H:i", "timepicker":"true"}'
                })
    

    请注意,此技术与 Crispy 无关 - 您可以对任何 Django 表单执行此操作,无论您是否使用 Crispy 来呈现它。

    【讨论】:

    • 我知道,但我希望它出现在我的 FormHelper 中。
    • 我可以理解,但 FormHelper 类不提供任何类型的初始化钩子,也与您的表单类的 fields 属性没有任何联系,所以我认为没有任何方法都可以做到这一点,除了表单 init 方法......或之后的任何时间!例如,当您实例化表单时,您可以在实际视图函数中执行一些类似的代码。只需在模板渲染之前从 form.fields['updated_date'] 开始修改即可。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2012-05-08
    相关资源
    最近更新 更多