Viewクラス
CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 1/18。
このセクションでは求人掲示板を作成します。そのホームページは、これまでのすべてのビューと同様に関数ビューです。Djangoではビューをクラスとして記述することもできます。Viewをサブクラス化し、HTTPメソッドごとにメソッドを1つ追加します。GETリクエストではget()が、POSTリクエストではpost()が呼び出されます。
from django.views import View
class RecipeCountView(View):
def get(self, request):
total = Recipe.objects.count()
return HttpResponse(f"{total} recipes")このメソッドはself、次にrequestを受け取り、関数ビューと同様にレスポンスを返します。ルートには関数が必要です。.as_view()を使うと、クラスから関数を作成できます。path("count/", views.RecipeCountView.as_view())。リクエストのたびに、その関数はクラスの新しいオブジェクトを作成し、リクエストに対応するメソッドを呼び出します。
このビューに対するPOSTのように、クラスで定義されていないメソッドのリクエストには、405 Method Not Allowedレスポンスが返されます。便利なのはこの先です。Djangoには、よくある処理をすでに実装したクラスが用意されています。
チャレンジ
簡単ホームページをクラスに変えましょう。
jobs/views.pyで、関数homeを、homeが行っていた処理をget()で行うViewであるHomeViewに置き換えます。jobs/urls.pyで、ルート""の参照先をクラスにします。name="home"はそのままにします。
「プレイ」を押します。ホームページには引き続き12 jobs openと表示されます。
自分で試してみよう
from django.shortcuts import render
from .models import Job
def home(request):
count = Job.objects.count()
return render(request, "jobs/home.html", {"count": count})
クラスベースビューのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド