首页 > 解决方案 > 如何在 Django Crisp Forms 中使用小部件

问题描述

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

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

表格.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"}'

                                           }),

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

标签: jquerydjangodjango-formsdjango-crispy-formsdjango-widget

解决方案


我不相信您可以在FormHelper基于 - 的类中做到这一点,相反,我通常做的是挂钩表单__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 来呈现它。


推荐阅读