Django ビュー - FBV と CBV

FBV(function base views)関数ベースのビューとは、ビュー内で関数を使ってリクエストを処理するものです。

CBV(class base views)クラスベースのビューとは、ビュー内でクラスを使ってリクエストを処理するものです。

FBV

関数ベースのビューは、実はこれまでの章でずっと使ってきました。ユーザーのリクエストを処理する関数を使うものです。以下の例を見てください:

ルーティング設定:

urls.py ファイル

urlpatterns = [
    path("login/", views.login),
]

views.py ファイル

from django.shortcuts import render,HttpResponse

def login(request):
    if request.method == "GET":
        return HttpResponse("GET メソッド")
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "サンプル" and pwd == "123456":
            return HttpResponse("POST メソッド")
        else:
            return HttpResponse("POST メソッド1")

ブラウザで http://127.0.0.1:8000/login/ に直接アクセスすると、出力結果は次のようになります:

GET 方法

CBV

クラスベースのビューは、クラスを使ってユーザーのリクエストを処理するものです。異なるリクエストはクラス内の異なるメソッドで処理できるため、コードの可読性が大幅に向上します。

定義するクラスは親クラス View を継承する必要があるため、まずライブラリをインポートする必要があります:

from django.views import View

対応するリクエストのメソッドを実行する前に、dispatch メソッドが優先的に実行されます(get/post/put... メソッドの前に実行)。dispatch() メソッドはリクエストに応じて対応するメソッドを呼び出して処理します。

実は、これまで学んだ知識から、Django の URL はリクエストをクラスではなく呼び出し可能な関数に割り当てるものだとわかっています。では、クラスベースのビューはどのように実現しているのでしょうか? 主に親クラス View が提供する静的メソッド as_view() を使います。as_view メソッドはクラスベースの外部インターフェースであり、ビュー関数を返します。呼び出されるとリクエストは dispatch メソッドに渡され、dispatch メソッドが異なるリクエストに応じて異なるメソッドを処理します。

ルーティング設定:

urls.py ファイル

urlpatterns = [
    path("login/", views.Login.as_view()),
]

views.py ファイル

from django.shortcuts import render,HttpResponse
from django.views import View

class Login(View):
    def get(self,request):
        return HttpResponse("GET メソッド")

    def post(self,request):
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "サンプル" and pwd == "123456":
            return HttpResponse("POST メソッド")
        else:
            return HttpResponse("POST メソッド 1")

ブラウザで http://127.0.0.1:8000/login/ に直接アクセスすると、出力結果は次のようになります:

GET 方法
その他の拡張