Djangoのビューには、関数で書くFBV(Function Based View)と、クラスで書くCBV(Class Based View)の2種類があります。
最初にCBVを見たとき、正直よくわかりませんでした。継承元のクラスが裏側で何をやっているのか見えず、「なぜこれで動くのか」がピンとこなかったからです。その点、FBVは処理がそのまま関数に書いてあるので直感的でした。
この記事では、URLconfの基本、FBVとCBVそれぞれの書き方、実務での使い分けを解説します。
モデルの基本がまだの方は、先にこちらを読んでおくとつながりがわかりやすいです。

URLconfの基本
Djangoでは、URLとビューの対応をurls.pyにまとめて書きます。この対応表のことをURLconfと呼びます。
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("articles/", views.article_list),
path("articles/<int:pk>/", views.article_detail),
]<int:pk>の部分はパスパラメータです。URLの一部を変数として受け取り、ビュー側の引数に渡してくれます。
FBV:関数でそのまま処理を書く
FBVは、リクエストを受け取ってレスポンスを返すだけの、ただの関数です。
# views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, "articles/list.html", {"articles": articles})
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
return render(request, "articles/detail.html", {"article": article})上から下に処理を読めば、何をやっているかがそのままわかります。これがFBVの一番の強みです。
CBV:クラスの継承で処理をまとめる
CBVは、Django側が用意した汎用クラスを継承して書きます。同じ処理をFBVより少ないコードで書けます。
# views.py
from django.views.generic import ListView, DetailView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = "articles/list.html"
context_object_name = "articles"
class ArticleDetailView(DetailView):
model = Article
template_name = "articles/detail.html"
context_object_name = "article"ListView・DetailViewは、それぞれ一覧表示・詳細表示によく使う処理をあらかじめ実装してくれています。urls.pyでは.as_view()を付けて登録します。
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("articles/", views.ArticleListView.as_view()),
path("articles/<int:pk>/", views.ArticleDetailView.as_view()),
]実務ではCBVを基本にしている
使い分けとしては、基本的にCBVを使っています。FBVを使うのは、そのほうが実装として合理的で簡単に済む場合だけです。
一覧・詳細・作成・更新・削除といった定型的な処理は、CBVに任せたほうがコード量が少なく済みます。逆に、複数のモデルにまたがる処理や、条件分岐が複雑な処理は、CBVの継承構造に無理やり当てはめるよりFBVで素直に書いたほうが読みやすいことが多いです。
CBVの「裏側が見えにくい」という感覚は、正直今でも完全になくなったわけではありません。ただ、使いながら少しずつ「このクラスはこのメソッドをオーバーライドすれば挙動を変えられる」というパターンがわかってきて、慣れとともに理解できるようになっていきました。
まとめ
URLconfでURLとビューを対応づけ、ビューではFBVかCBVで処理を書く。これがDjangoのリクエスト処理の基本形です。
CBVは最初、裏側の動きが見えずに戸惑うかもしれません。それでも大丈夫です。使いながら少しずつ慣れていけば、自然と理解できるようになります。
ビューが書けるようになったら、次は画面表示を担うテンプレートに進みましょう。

Django全体のロードマップに戻りたい方はこちらからどうぞ。


コメント