Джанго хрустящая форма __init__

Я только начал использовать хрустящую форму и заметил некоторые неточности в описании форм и какой эффект это окажет в будущем.

Из примера в 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): для примера внутри документации. Зачем использовать его, когда вы можете просто определить свою форму, используя метод, показанный в первом примере. Будут ли какие-либо преимущества/минусы для любого из них?


person Chuan Yeong    schedule 19.12.2012    source источник


Ответы (1)


Выполнение этого в методе __init__ позволяет изменять вспомогательную функцию (кнопку «показать/скрыть») на основе содержимого формы до рендеринга.

Лично я, чтобы сохранить гибкость и уменьшить количество вычислений помощников, поместил его в атрибут свойства.

Это также позволяет мне иметь естественно независимых помощников для дочерних форм.

Ваш метод хорош в простом случае, когда вы обрабатываете одну форму с помощью статического помощника. В противном случае это может быть опасно.

Я использую миксин с заданным свойством, который позволяет мне чувствовать себя более похожим на расширенную форму 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

Метод __init__, который устанавливает self.helper, возможно, тоже выполнил свою работу. (но иногда я использую формы для простой проверки без рендеринга, поэтому я установил его в свойстве).

Надеюсь это поможет

person christophe31    schedule 19.12.2012