FormView

Django

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>
タイトルとURLをコピーしました