13

フォームテンプレートのさまざまな部分でさまざまなフィールドをレンダリングできるようにしたいクリスピーフォームがありますが、クリスピードキュメントHTMLでこれを行う方法が見つかりません。以下は、私たちがやろうとしていることを説明するために、わずかに作成されたコードです。

フォーム.py

helper = FormHelper()
helper.layout_1 = Layout(
    Div(
        Field('field_1a'),
        Field('field_1b')
    )
)
helper.layout_2 = Layout(
    Div(
        Field('field_2a'),
        Field('field_2b')
    )
)

template.html

<body>
    {% crispy form layout_1 %}
    <!-- A big bunch of other html -->
    {% crispy form layout_2 %}
</body>

これを達成するためのクリーンな方法を知っている人はいますか?


これまで検討して除外しなければならなかったアプローチは次のとおりです。

  • フィールドをクリスピーにレンダリングする代わりに、手動で HTML にフィールドを追加することができます。choiceただし、オプションがプログラムで決定されるフィールドが多数あるため、これはうまくいかないようです。
  • crispy.forms.layout.HTMLレイアウトの 2 つの異なる部分を分割する HTML を含むオブジェクトを使用するクリスピーなレイアウトを作成できます。しかし、HTML が多く、これを直接 python に埋め込むと保守が難しくなります。
  • カスタム レイアウト オブジェクトを作成してこれを行うこともできますが、これは非常に複雑になると予想されるため、これは最後の手段と考えたいと考えています。
  • クリスピーを使用せず、代わりにクリスピーの外でこれを実現する方法を探すこともできますが、そうすると、アプリケーション内の他のすべてのフォームとの一貫性が失われます。
4

2 に答える 2

17

更新:これは機能しませんforms.ModelForm

2 つのレイアウトではなく 2 つのヘルパーを作成してから、個別のヘルパーを明示的に呼び出してみてください。このようにすると<form>、テンプレートで両方のフォームを囲むタグを手動で記述する必要がありますが、必要なソリューションが提供されることを願っています。

forms.py

class Form(forms.Form):
    field_1a = forms.CharField()
    field_1b = forms.CharField()
    field_2a = forms.CharField()
    field_2b = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        self.helper1 = FormHelper()
        self.helper1.form_tag = False
        self.helper1.layout = Layout(
            Div(
                Field('field_1a'),
                Field('field_1b')
            )
        )

        self.helper2 = FormHelper()
        self.helper2.form_tag = False
        self.helper2.disable_csrf = True
        self.helper2.layout = Layout(
            Div(
                Field('field_2a'),
                Field('field_2b')
            )
        )

次に、テンプレートで:

<body>
<form>
{% crispy form form.helper1 %}
<!-- A big bunch of other html -->
{% crispy form form.helper2 %}
</form>
</body>
于 2013-07-22T11:39:22.947 に答える