FormViewとはクラスベースビューの一種で、フォームの作成に特化したクラスです。
FormMixinクラス、ProcessFormViewクラスなどを継承していて、その属性やメソッドを受け継いでいる。
FormViewクラスの属性
クラス変数(属性) 内容
template_name #テンプレートHTMLのパス
form_class #フォームクラス
success_url #POST時にリダイレクトしたいページのURL
FormMixinクラスの属性
initial #フォームの初期値をdict形式で指定します。
form_class #forms.pyで定義したフォームを指定します。
success_url #POST時にフォームの内容が問題なければリダイレクトされるページのURLを指定します。
#動的なページ(他のテンプレート)への遷移の場合、reverse_lazy()を使用します。
prefix #生成したフォームのフィールド名のプレフィックス。
#例えばprefix=”test”とすると、各フィールド名の頭に”test-“が付与されます。
FormMixinクラスのメソッド
get_initial() #フォームの初期値を返します。デフォルトではinitial属性のコピーを返します。
get_form_class() #使用するフォームクラスを返します。
#デフォルトではform_class属性を返します。
get_form(form_class=None) # get_form_kwargs()メソッドの戻り値をパラメータとして
#form_class属性で指定したクラスのインスタンスを返します。
get_form_kwargs() #フォームクラスのパラメータを返します。
#ここでinitialとpredixがパラメータとして設定されます。
#POST時にはPOSTしたデータが設定されます。
get_prefix() #生成されたフォームのプレフィックスを返します。デフォルトではprefix属性を返します。
get_success_url() #フォームのバリデーション成功時のリダイレクト先を返します。デフォルトではsuccess_url属性を返します。
form_valid(form) #バリエーション成功時に呼び出され、get_success_url()メソッドの戻り値にリダイレクトします。
form_invalid(form) #バリエーション失敗時に呼び出され、不正なフォーム内容を保持したフォーム画面を再表示します。
get_context_data(**kwargs) get_form() #メソッドで得たフォームクラスのインスタンスに対して、入力されたフォーム情報を追加します。
ProcessFormViewクラスのメソッド
get(request, *args, **kwargs)
GET時の動作を定義します。get_context_dataメソッドで得たコンテキスト情報をテンプレートにレンダリングします。
post(request, *args, **kwargs)
POST時の動作を定義します。入力されたフォームを取得し、バリデーション結果が成功であればform_valid、失敗であればform_invalidメソッドを呼び出します。
put(*args, **kwargs)
PUT時の動作を定義します。実際はpostメソッドを呼び出しているだけなので動作はPOST時と同じです。
urls.py>
from django.urls import path
from . import views
urlpatterns = [
path('form/', views.MemberFormView.as_view(), name='form'),
]
forms.py>
from django import forms
class MemberForm(forms.Form):
name = forms.CharField(max_length=100, label = '名前')
age = forms.IntegerField(label='年齢')
views.py>
from django.urls import reverse_lazy
from django.views.generic.edit import FormView
from .forms import MemberForm
class MemberFormView(FormView):
# テンプレート名の設定
template_name = 'app/form.html'
# POST時の線先の設定
#success_url = '/static/app/top.html' ---静的ページへの遷移
success_url = reverse_lazy('form') ---動的ページへの遷移
# フォームの設定
form_class = MemberForm
# フォームの初期値を指定します
initial = {"name": "Takuya", "age": 30}
# フィールド名の先頭に文字列を追加します
prefix = "test"
# form_validをオーバーライドする
def form_valid(self, form):
introduction = f"私の名前は{form.cleaned_data['name']}です。年齢は{form.cleaned_data['age']}歳です。"
context = {'form': form, 'intro': introduction}
return render(self.request, self.template_name, context)
form.html>
<form method='POST'>
{% csrf_token %}
{{ form }}
<button name="btn_submit" type="submit">
送信
</button>
</form>
{{ intro }}
top.html>
<h1>Thank you!</h1>