#はじめに
Djangoのビューを今まで関数ベースビューメインで書いていましたが、
今回はDjangoフレームワークが用意しているビュー用の親クラスを継承しクラスベースのビューを作成したいので両者を簡単にまとめました。
##関数ベースビュー
関数ベースビューは以下のような構造をしています。
def hoge(request):
[内部処理]
return HTTPレスポンス
以下実例です。
def view(request):
if request.method=='POST':
form=HogeForm(request.POST)
if form.is_valid():
form.save()
return redirect('hoge')
else:
form=HogeForm()
context = {
'form': form,
}
return render(request,'hoge.html',context)
hoge.htmlというテンプレートをロードし、contextという辞書変数にテンプレート変数名とその値を格納し、
renderクラスでテンプレートをレンダリングしその結果をHTTPResponseとして返します。
HTTPResponseを行うクラスはrender,redirect,TemplateResponseの3つ。詳しくはここ
##クラスベースビュー
Djangoフレームワークで用意されたビュー用の親クラスを継承し使用します。
class View(LoginRequiredMixin,FormView):
template_name='hoge.html'
form_class=HogeForm
success_url=reverse_lazy('hoge')
def get_context_data(self, **kwargs):
context=super().get_context_data(self, **kwargs)
return context
#formでの入力が正常であった場合に呼ばれる
def form_valid(self,form):
form.save()
messages.success(self.request, "success")
#return HttpResponseRedirect(self.get_success_url())
return render(self.request,'hoge',self.get_context_data())
cotext変数→get_context_data関数
HTTPResponse→form_valid/form_invalid関数
と対応しています。
なお、クラスベースビューはurls.pyに登録する際はpathの第2引数は関数を渡す必要があるためView.as_view()のようにします。
urlpatterns=[
path('hoge/',View.as_view(),name='hoge')
]
##まとめ
クラスベースビューは関数ベースビューを汎用化してくれているためたくさん定義する場合はできる限りクラスベースビューで書くのがいいかなと個人的に思います。
##参考サイト
https://ebi-works.com/django-view/
https://docs.djangoproject.com/ja/3.1/intro/tutorial03/