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をHomeViewに置き換えます。これは、get()がhomeと同じ処理を行うViewです。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プレイグラウンド