2

私はクリスピー フォームを使い始めたばかりで、フォームの記述方法にいくつかの不規則性があることに気付きました。

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):ドキュメント内の例での行の使用を見て混乱しています。最初の例で示した方法を使用してフォームを簡単に定義できるのに、なぜそれを使用するのでしょうか。それらのいずれかに利点/欠点はありますか?

4

1 に答える 1

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

__init__self.helper を設定するメソッドもその作業を行った可能性があります。(ただし、レンダリングせずに単純な検証にフォームを使用することがあるので、プロパティに設定しました)。

お役に立てれば

于 2012-12-19T14:51:49.977 に答える