【Django】ビュー・URLルーティング完全ガイド|FBV・CBV・URLconfを徹底解説

Djangoのビューには、関数で書くFBV(Function Based View)と、クラスで書くCBV(Class Based View)の2種類があります。

最初にCBVを見たとき、正直よくわかりませんでした。継承元のクラスが裏側で何をやっているのか見えず、「なぜこれで動くのか」がピンとこなかったからです。その点、FBVは処理がそのまま関数に書いてあるので直感的でした。

この記事では、URLconfの基本、FBVとCBVそれぞれの書き方、実務での使い分けを解説します。

モデルの基本がまだの方は、先にこちらを読んでおくとつながりがわかりやすいです。

URLconfの基本

Djangoでは、URLとビューの対応をurls.pyにまとめて書きます。この対応表のことをURLconfと呼びます。

Python
# 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は、リクエストを受け取ってレスポンスを返すだけの、ただの関数です。

Python
# 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より少ないコードで書けます。

Python
# 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"

ListViewDetailViewは、それぞれ一覧表示・詳細表示によく使う処理をあらかじめ実装してくれています。urls.pyでは.as_view()を付けて登録します。

Python
# 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全体のロードマップに戻りたい方はこちらからどうぞ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする