フォーム入力画面を作成するには、
- CreateViewクラスをオーバーライドする方法
- FormViewクラスをオーバーライドする方法
- 関数ビューで自分で書く方法
の主に3種類があります。
以下は、まったく同じ動きをするフォームを、3種類の書き方で書いています。(フォームのクラスはforms.pyで別途定義してあるものとします。)
- CreateViewクラスをオーバーライドする方法
CreateViewクラスは、FormViewクラスをオーバーライドした、フォームからのデータ登録に特化したクラスです。
単純に入力→保存を行うような機能がめちゃくちゃ簡単にできます。テンプレートは指定がなければ、アプリ名_form.htmlがデフォルトテンプレートとなります。
1 2 3 4 5 6 7 8 9 10 11 |
from django.views.generic.edit import CreateView from django.urls import reverse_lazy from .forms import HogeForm class HogeCreateView(CreateView): # modelに基となるクラスを指定 model = Hoge # 別途定義したフォームのクラスを指定 form_class = HogeForm # 登録完了後の遷移ページ success_url = reverse_lazy('hoge:top') |
- FormViewクラスをオーバーライドする方法
CreateViewは値が正しければDBに自動的に登録してくれるクラスですが、FormViewはそのままでは登録までは勝手にしてくれません。
送られた値が正しかった時に他に何かしたい、といった時に使うのがいいのではないかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from django.views.generic.edit import FormView from django.urls import reverse_lazy from .forms import HogeForm class HogeCreateView(FormView): template_name = 'hoge_form.html' # 別途定義したフォームのクラスを指定 form_class = HogeForm # 登録完了後の遷移ページ success_url = reverse_lazy('hoge:top') # 送られた値が正しかった時の処理 def form_valid(self, form): # 保存 form.save() return super().form_valid(form) |
- 関数ビューで自分で書く方法
FormViewクラスに比べ、テンプレートへのレンダリングなども含みます。
sessionやcookieに何か保存したり呼び出したりなど、仕様を細かく指定した時には自分で関数ビューを書いた方が良いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from django.shortcuts import redirect from .forms import HogeForm def HogeCreateView(request): # フォームから送信されたオブジェクトを取得 form = HogeForm(request.POST) # 送られた値が正しかった時の処理 if form.is_valid(): # 保存 form.save() # 登録完了後の遷移ページ return redirect('hoge:top') # コンテキストデータにフォームのオブジェクトを指定しレンダリング context = { 'form': form, } return render(request, 'hoge_form.html', context) |
以上、備忘録。