web-dev-qa-db-ja.com

ModelFormでクリスピーフォームを使用する

クリスピーフォーム に遭遇しましたが、まさに私が望んでいることを実行しているようです:bootstrap layoutでフォームをレンダリングします。

ここで、例ではforms.Formの使用について説明します。これは大丈夫です、私はこのようなコードを書くことによって私のものを作成することができます:

class TemplateCreateForm(forms.Form):
    title = forms.CharField(label=(u'Task name'))
    description = forms.CharField(label=(u'Task description'))
    url_start = forms.CharField(label=(u'Start page url'))
    url_end = forms.CharField(label=(u'Final page url'))

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.add_input(Submit('submit', 'Submit'))
        super(TemplateCreateForm, self).__init__(*args, **kwargs)

しかし、どのように更新するのですか?これをビューに入れると:

    form = TemplateCreateForm(request.POST or None, instance=template)

インスタンスはModelForm専用であるため、機能しません。

さて、forms.FormModelFormに置き換えて、ModelFormの代わりにクリスピーフォームを使用できますか?これは私がしました

class TemplateCreateForm(ModelForm):
    title = forms.CharField(label=(u'Task name'))
    description = forms.CharField(label=(u'Task description'))
    url_start = forms.CharField(label=(u'Start page url'))
    url_end = forms.CharField(label=(u'Final page url'))

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.add_input(Submit('submit', 'Submit'))
        super(TemplateCreateForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Template
        exclude = ('user')

ここで、Metaクラスを追加しました。今:それは動作しますが、このように使用するのは正しいですか?更新もこのように機能します。

更新を行うためにフォームを使用する正しい方法は何ですか?

21
EsseTi

私はDjango-crispy-formsの主任開発者です。フォーマットが少し悪いので、あなたの質問に従うかどうかはわかりません。あなたは正確に何をしようとしていますか?

Django-crispy-formsは、単純なフォームの場合と同じように、ModelFormsでも機能します。 Djangoの上にあるので、混乱することはありません。フォームのレンダリングを制御するだけで、検証の仕組みやフォームインスタンスの作成方法などは変更されません。

編集:

クリスピーフォームでModelFormを実行する方法の例を追加します。

class ExampleModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ExampleModelForm, self).__init__(*args, **kwargs)

        # If you pass FormHelper constructor a form instance
        # It builds a default layout with all its fields
        self.helper = FormHelper(self)

        # You can dynamically adjust your layout
        self.helper.layout.append(Submit('save', 'save'))

    class Meta:
        model = ExampleModel

あなたの最初の問題はあなたがサブクラス化していたことだと思いますforms.Form の代わりに forms.ModelForm。そのため、あなたの問題はDjangoに関連しており、クリスピーフォームに関連しているのではありません。

後であなたの見解:

form = ExampleModelForm()

テンプレート内:

{% load crispy_forms_tags %}
{% crispy form %}
55
maraujop