クラスベースのビューを使用したフォーム処理—Djangoドキュメント
クラスベースのビューによるフォーム処理
フォーム処理には通常、次の3つのパスがあります。
- 初期GET(空白または事前入力されたフォーム)
- 無効なデータを使用したPOST(通常はエラーのあるフォームを再表示します)
- 有効なデータを使用したPOST(データを処理し、通常はリダイレクトします)
これを自分で実装すると、多くの場合、ボイラープレートコードが繰り返されます(ビューでのフォームの使用を参照)。 これを回避するために、Djangoはフォーム処理用の汎用クラスベースビューのコレクションを提供します。
基本的なフォーム
お問い合わせフォームを指定します。
forms.py
ビューは、FormView
を使用して作成できます。
views.py
ノート:
- FormViewは TemplateResponseMixin を継承するため、ここでは template_name を使用できます。
- form_valid()のデフォルトの実装は、単に success_url にリダイレクトします。
モデルフォーム
モデルを操作するとき、一般的なビューは本当に輝いています。 これらの汎用ビューは、使用するモデルクラスを決定できる限り、 ModelForm を自動的に作成します。
- model 属性が指定されている場合、そのモデルクラスが使用されます。
- get_object()がオブジェクトを返す場合、そのオブジェクトのクラスが使用されます。
- queryset が指定されている場合、そのクエリセットのモデルが使用されます。
モデルフォームビューは、モデルを自動的に保存する form_valid()実装を提供します。 特別な要件がある場合は、これをオーバーライドできます。 例については、以下を参照してください。
CreateView または UpdateView にsuccess_url
を提供する必要はありません。可能な場合は、モデルオブジェクトで get_absolute_url()を使用します。 。
カスタム ModelForm を使用する場合(たとえば、検証を追加する場合)、ビューで form_class を設定します。
まず、 get_absolute_url()をAuthor
クラスに追加する必要があります。
models.py
次に、 CreateView とその仲間を使用して実際の作業を行うことができます。 ここで、一般的なクラスベースのビューを構成していることに注目してください。 自分でロジックを書く必要はありません。
views.py
fields
属性は、 ModelForm の内部Meta
クラスのfields
属性と同じように機能します。 別の方法でフォームクラスを定義しない限り、属性は必須であり、そうでない場合、ビューは ImpproperlyConfigured 例外を発生させます。
fields 属性と form_class 属性の両方を指定すると、 ImpproperlyConfigured 例外が発生します。
最後に、これらの新しいビューをURLconfにフックします。
urls.py
ノート
これらのビューは、 template_name_suffix を使用してモデルに基づいて template_name を構築する SingleObjectTemplateResponseMixin を継承します。
この例では:
- CreateView および UpdateView は
myapp/author_form.html
を使用します - DeleteView は
myapp/author_confirm_delete.html
を使用します
CreateView と UpdateView に別々のテンプレートが必要な場合は、ビュークラスに template_name または template_name_suffix のいずれかを設定できます。
モデルとrequest.user
CreateView を使用してオブジェクトを作成したユーザーを追跡するには、カスタム ModelForm を使用してこれを行うことができます。 まず、モデルに外部キー関係を追加します。
models.py
ビューで、編集するフィールドのリストにcreated_by
が含まれていないことを確認し、 form_valid()をオーバーライドしてユーザーを追加します。
views.py
LoginRequiredMixin は、ログインしていないユーザーがフォームにアクセスできないようにします。 これを省略すると、 form_valid()で許可されていないユーザーを処理する必要があります。
コンテントネゴシエーションの例
これは、APIベースのワークフローと「通常の」フォームPOSTで機能するフォームを実装する方法を示す例です。