Djangoのクラスベースビューの中でも、フォームを作成するのに特化したFormView。
今回は、このFormViewの使い方を説明し、最低限の変数の設定でフォームを作成する実装例を紹介します。
フォーム機能は、Webアプリケーションを作成する上では必須の機能ですので、ぜひ習得してください!
また、以下の記事ではクラスベースビューについて解説しているので、クラスベースビューが分からないという方はまずはこちらを読むことをおすすめします。
Djangoに必要なHTML/CSS、JavaScriptなどのWeb開発系言語は侍テラコヤという学習サイトで無料で学習できるのでおすすめですよ!
以下の記事では、Djangoが学べるおすすめのプログラミングスクールをDjangoを学ぶ目的別に紹介しています。
Djangoの習得には幅広い知識が必要で、独学では大変な部分も多いと思いますので、気になる方はよければ覗いてみてください。
FormViewとは
FormViewとはクラスベースビューの一種で、フォームの作成に特化したクラスです。
いくつかの属性(クラス変数)を設定するだけで簡単にフォームの作成を行うことができます。
今回はFormViewを使ったフォームの作成方法と、FormViewで使用できる属性やメソッドに関して説明しています。
クラスベースビューに関する説明は以下でおこなっているので、合わせてご参照ください!
FormViewを用いたフォームの実装方法
ではさっそくFormViewを用いたフォーム画面の実装を行います。
最初にフォームの入力ページが表示され、何かしらの値を入力して送信ボタンを押すと、別のページに遷移する例です。
なお、アプリ名はappとしますので、パス情報に”app”が含まれている部分は適宜アプリ名に書き換えてください。
urls.py
urls.pyはFormViewに限った特別なことは不要です。
今回は、forms/というパスに対してフォームの入力画面が表示されるように設定します。
後で定義しますが、ビュー名はMemberFormViewです。
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
続いて、本題のFormViewを定義していきましょう。
といっても特に難しいことはなく、基本的には以下のクラス変数(属性)を設定するだけでOKです!
クラス変数(属性) | 内容 |
---|---|
template_name | テンプレートHTMLのパス |
form_class | フォームクラス |
success_url | POST時にリダイレクトしたいページのURL |
上記の属性を設定した例を以下に示します。
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'
# フォームの設定
form_class = MemberForm
1つ目はtemplate_name属性で、これはほとんどのクラスベースビューに共通した属性です。
このtemplate_nameに設定した名前のテンプレートを使用するようになります。
続いてsuccess_url属性ですが、これはフォーム入力後のPOST時に遷移するページを設定します。
今回は静的ページに遷移するようにしていますが、reverse_lazy関数を使用すれば動的なページへ遷移することが可能です。
reverse_lazy関数を使用した例はこちらで説明しています。
最後にform_class属性ですが、これは最も重要な属性で、使用するフォームクラスを指定します。
今回はforms.pyに定義したMemberFormを使用します。
それぞれの属性の詳細や、その他の属性についてはこのページの下の方で解説しているのでご確認ください。
テンプレート
FormViewでは、formというコンテキスト情報が設定されます。
テンプレートではそのformを使用することでフォームの表示が可能です。
また、以下のテンプレートではPOST用の送信ボタンを設定しています。
<form method='POST'>
{% csrf_token %}
{{ form }}
<button name="btn_submit" type="submit">
送信
</button>
</form>
また、送信ボタンを押した時の遷移先のページとして以下のテンプレートも作成します。
こちらはコンテキスト情報を使用しない制定なページなので、app/static/app/top.htmlという場所に作成します。
<h1>Thank you!</h1>
ブラウザ表示
以上の設定の結果、以下のようなブラウザ表示が得られます。
FormViewクラスの概要
ここからは、FormViewクラスについてさらに深掘りしていきます。
継承や属性、メソッド等について細かく見ていくので、興味のある人はぜひご覧ください。
FormViewクラスは、TemplateResponseMixinクラスとBaseFormViewクラスを継承しているだけで、メソッドや属性の定義はありません。
FormViewのクラス図とメソッド解決順序(MRO)
FormViewクラスはさまざまなクラスを継承して実装されており、クラス図は以下のようになります。
また、FormViewのメソッド解決順序(MRO)は、以下の順です。(クラス図の左側から深さ優先探索したものと一致します)
MROというのは、同じ名前のメソッドがあったときにどのメソッドを優先するかの順序です。
※リンクをクリックすると、各クラスの説明に飛べます。
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseFormView
- django.views.generic.edit.FormMixin
- django.views.generic.base.ContextMixin
- django.views.generic.edit.ProcessFormView
- django.views.generic.base.View
BaseFormViewクラス
BaseFormViewクラスも、FormViewクラスとProcessFormViewクラスを継承しているだけで、メソッドや属性の定義はありません。
FormMixinクラス
FormMixinクラスでは、フォーム表示に必要な属性やメソッドがいくつか定義されています。
FormMixinクラスの属性
FormMixinクラスの属性を以下にまとめます。
FormViewでは、以下の属性を使ってフォームの作成を行うことが可能です。
属性 | 説明 |
---|---|
initial | フォームの初期値をdict形式で指定します。 |
form_class | forms.pyで定義したフォームを指定します。 |
success_url | POST時にフォームの内容が問題なければリダイレクトされるページのURLを指定します。動的なページ(他のテンプレート)への遷移の場合、reverse_lazy()を使用します。 |
prefix | 生成したフォームのフィールド名のプレフィックス。例えばprefix=”test”とすると、各フィールド名の頭に”test-“が付与されます。 |
属性の使用例
FormViewの属性の使用例をみていきましょう。
form_classとsuccess_urlは常に設定することになると思いますが、initialとprefixは必要に応じて設定するといいです。
以下ではtemplate_nameという属性を設定していますが、これはTemplateViewの属性で、使用するテンプレート名を指定します。
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 = reverse_lazy('form')
# MemberFormをフォームとして表示します
form_class = MemberForm
# フォームの初期値を指定します
initial = {"name": "Takuya", "age": 30}
# フィールド名の先頭に文字列を追加します
prefix = "test"
上記のように属性を設定した場合のブラウザ表示は以下のようになります。
このように、initialに指定した値がすでにフォームに設定された状態で表示されます。
また、送信ボタンを押してもsuccess_urlで指定したページ(同じフォーム画面)にリダイレクトされます。
このときのrequest.POSTの内容は以下のようになり、確かにフィールド名の先頭にprefixが付与されていることもわかります。
<QueryDict: {'test-name': ['Takuya'], 'test-age': ['30'], 'btn_submit': ['']}>
FormMixinクラスのメソッド
FormMixinクラスで定義されているメソッドの一覧を載せます。
FormViewでは、これらのメソッドを呼び出して画面の表示などが行われます。
メソッド名 | 説明 |
---|---|
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()メソッドで得たフォームクラスのインスタンスに対して、入力されたフォーム情報を追加します。 |
FormViewでは基本的にこれらのメソッドの中身をのぞいたり、オーバーライドしたりして機能を追加する必要はなく、属性の設定だけで最低限の機能は実現できます。
以下、いくつかのメソッドをピックアップして説明します。
get_form_kwargs
get_form_kwargsメソッドは、フォームクラスのパラメータを指定するクラスです。
フォームクラスのパラメータにはデフォルトでは以下が設定されます。
パラメータ | 説明 | 設定される値 |
---|---|---|
init | フォームに初期値として入力される値 | get_initialメソッドの戻り値(initial属性の値) |
prefix | フォームのフィールド名のプレフィックス | get_prefixメソッドの戻り値(prefix属性の値) |
data | フォームの内容 ※POST、PUT時のみ | request.POST |
files | 添付ファイルの内容 ※POST、PUT時のみ | request.FILES |
以下の記事では、このget_form_kwargsメソッドをオーバーライドすることで、GET時でもdataパラメータを設定するようなことをやっています。
form_valid
form_validメソッドは、フォームのバリデーションが成功したときに呼び出されるメソッドです。
中身は、get_success_urlの戻り値(success_url属性の値)へのリダイレクトになっています。
以下の記事では、form_validメソッドをオーバーライドして、POST時の動作を任意の動作に変える手法を説明しています。
get_context_data
get_context_dataメソッドは、FormViewに限らず、すべてのクラスベースビューにおいて重要なメソッドです。
最低限の機能だけであれば特に意識する必要はありませんが、テンプレートに独自のコンテキスト情報を付与したい場合などに使用します。
以下の記事ではクラスベースビューにおけるget_context_dataの使い方等を説明しています。
ProcessFormViewクラス
ProcessFormViewクラスは、GET・POST・PUT時の動作を定義したメソッドを定義しています。
属性は定義されていません。
ProcessFormViewクラスのメソッド
メソッド名 | 説明 |
---|---|
get(request, *args, **kwargs) | GET時の動作を定義します。get_context_dataメソッドで得たコンテキスト情報をテンプレートにレンダリングします。 |
post(request, *args, **kwargs) | POST時の動作を定義します。入力されたフォームを取得し、バリデーション結果が成功であればform_valid、失敗であればform_invalidメソッドを呼び出します。 |
put(*args, **kwargs) | PUT時の動作を定義します。実際はpostメソッドを呼び出しているだけなので動作はPOST時と同じです。 |
まとめ
以上、FormViewの使い方や属性、メソッドについて説明しました。
自分がFormViewを使ってどんなことがしたいか?を考えながら属性やメソッドの説明を読むと、どの属性やメソッドを設定すればいいのかが分かってくるはずです。
基本的な機能だけであれば、success_urlやform_class、template_nameを設定するだけでフォーム画面を実装できます。
メソッドであれば、get_context_dataあたりをオーバーライドする例をよく見るかもしれません。
クラスベースビューを使いながら、そのやり方に慣れていってください。
なお、侍テラコヤという学習サイトでは、DjangoをはじめPythonやHTML/CSS/JavaScriptを無料で学ぶことができます!
メールアドレスだけで簡単に無料登録できるのでぜひ覗いてみてくださいね。
\無料プランを無期限で試す/
メールアドレスだけで10秒で登録!
Djangoはまだまだたくさんの機能が盛り沢山です。
このサイトでは、他にもさまざまな解説記事を載せているので、ぜひ参考にしてください!
また、独学だけでなく、人から教えてもらうというのも大切です。
以下の記事ではDjangoが学べるプログラミングスクールを、目的別におすすめを紹介していますので、こちらもぜひご検討ください。
コメント