Как использовать виджеты в Django Crisp Forms

Я использую формы Django Crispy и его FormHelper. В моем классе FormHelper я хочу, чтобы одно из полей использовало виджеты. Причина использования виджета в том, что я хочу заполнить средство выбора даты в одном из полей.

Используя поле, я могу заполнить DatePicker в моей updated_date, указав css_class. Но я хочу дать 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"}'

                                           }),

Я просто не могу понять, как я буду использовать виджет.


person Femme Fatale    schedule 14.08.2019    source источник


Ответы (1)


Я не верю, что вы можете сделать это в своем классе на основе FormHelper, вместо этого я обычно подключаюсь к методу __init__ класса form, и именно там я буду выполнять любые изменения в форма/макет/виджеты и т. д. Что-то в этом роде может сработать для вас:

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 для ее рендеринга или нет.

person YellowShark    schedule 16.08.2019
comment
Это я знаю, но я хотел, чтобы это было в моем FormHelper. - person Femme Fatale; 16.08.2019
comment
Я могу это оценить, но класс FormHelper не предлагает никаких хуков инициализации и не имеет никакого отношения к свойству fields вашего класса формы, поэтому я не думаю, что есть какой-либо способ сделать это, кроме как в формах init метод... или в любое время после этого! Например, вы можете сделать аналогичный код внутри вашей фактической функции просмотра, когда вы создаете экземпляр формы. Просто начните взламывать form.fields['updated_date'] до того, как шаблон будет отображен. - person YellowShark; 16.08.2019