MENU
\ お問い合わせはこちら! /

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

  • DjangoのビューとURLの関係がよくわからない
  • 関数ベースビューとクラスベースビューの違いを知りたい
  • URLconfの書き方をマスターしたい

この記事ではDjangoのビューとURLルーティングの仕組みを解説します。関数ベースビュー(FBV)とクラスベースビュー(CBV)の使い分け、URLconfの書き方、よく使うビューパターンをひとつの記事でまとめています。

この記事を読む前に

  • Djangoのプロジェクト・アプリ構成を理解していること
  • モデルの基本的な書き方を知っていること

ビューとURLルーティングの仕組み

Djangoでリクエストがどう処理されるかを理解しておくと、ビューの役割が見えてきます。

  1. ブラウザからリクエストが届く
  2. URLconfがURLを照合して、対応するビュー関数を呼び出す
  3. ビューがリクエストを処理してレスポンスを返す
  4. レスポンスがブラウザに返される

ビューは「リクエストを受け取ってレスポンスを返す関数(またはクラス)」です。URLconfは「どのURLにどのビューを対応させるか」を定義するものです。

関数ベースビュー(FBV)

最もシンプルなビューの書き方です。Python関数として書くので、処理の流れが読みやすくなります。

Python
from django.shortcuts import render, get_object_or_404
from .models import Article

def article_list(request):
    articles = Article.objects.filter(is_published=True)
    return render(request, "blog/article_list.html", {"articles": articles})

def article_detail(request, pk):
    article = get_object_or_404(Article, pk=pk)
    return render(request, "blog/article_detail.html", {"article": article})
  • render(request, テンプレート名, コンテキスト)
    テンプレートにコンテキストを渡してHTMLを生成し、HttpResponseとして返す
  • get_object_or_404(Model, 条件)
    条件に一致するオブジェクトを取得。見つからなければ自動で404を返す

POSTリクエストの処理

フォームの送信など、GETとPOSTを同じビューで処理するパターンです。

Python
def contact(request):
    if request.method == "POST":
        # フォームの処理
        name = request.POST.get("name", "")
        # ... 処理 ...
        return redirect("thanks")
    return render(request, "contact/form.html")

クラスベースビュー(CBV)

よくあるCRUD処理をクラスとして提供する仕組みです。定型的な処理を短く書けるのが利点です。Djangoにはよく使うパターンが汎用ビューとして用意されています。

クラス用途
ListView一覧表示
DetailView詳細表示
CreateView新規作成フォーム
UpdateView編集フォーム
DeleteView削除確認・実行
TemplateViewテンプレートを表示するだけ(静的ページ向け)
RedirectView別URLにリダイレクト

FBVで書いた一覧・詳細ビューをCBVで書き直すとこうなります。

Python
from django.views.generic import ListView, DetailView
from .models import Article

class ArticleListView(ListView):
    model = Article
    template_name = "blog/article_list.html"
    context_object_name = "articles"
    queryset = Article.objects.filter(is_published=True)

class ArticleDetailView(DetailView):
    model = Article
    template_name = "blog/article_detail.html"
    context_object_name = "article"

CBVはURLconfで登録するとき .as_view() を付けるのを忘れずに。

FBVとCBVの使い分け

FBVCBV
コード量多め少なめ(定型処理なら)
読みやすさ処理の流れがわかりやすい継承関係を把握する必要がある
カスタマイズ自由に書けるメソッドオーバーライドで対応
向いている場面複雑なロジック・例外的な処理標準的なCRUD・一覧・詳細

迷ったらFBVで書いて、「同じような処理を何度も書いているな」と感じたときにCBVへ切り替えるのが現実的です。

URLconf(urls.py)

URLconfはURLとビューのマッピングを定義するファイルです。アプリごとに urls.py を作り、プロジェクトのルートURLconfに include() でまとめるのが定番の構成です。

アプリのurls.py

Python
# blog/urls.py
from django.urls import path
from . import views

app_name = "blog"

urlpatterns = [
    path("", views.ArticleListView.as_view(), name="list"),
    path("<int:pk>/", views.ArticleDetailView.as_view(), name="detail"),
]

プロジェクトのurls.pyにinclude

Python
# config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("blog/", include("blog.urls")),
]

この設定で /blog/ が一覧ページ、/blog/1/ がID=1の詳細ページになります。

パスコンバータ

URLのパスパラメータには型を指定できます。

コンバータマッチするもの
int0以上の整数<int:pk>
strスラッシュを除く任意の文字列<str:slug>
slugASCII文字・数字・ハイフン・アンダースコア<slug:slug>
uuidUUID形式<uuid:id>
pathスラッシュを含む任意の文字列<path:filepath>

URL名前解決(reverse・url タグ)

name を設定したURLは、ビューやテンプレートからURLをハードコードせずに参照できます。

Python
from django.urls import reverse
from django.shortcuts import redirect

def some_view(request):
    # ビューから名前でURLを生成
    url = reverse("blog:detail", kwargs={"pk": 1})
    return redirect("blog:list")

app_name を設定してある場合は アプリ名:URL名 の形式で参照します(例: "blog:detail")。URLを直書きしないことで、URL変更時の修正コストを最小化できます。

ミドルウェア

ミドルウェアはリクエストとレスポンスの間に挟まる処理の層です。認証チェック・セッション管理・CSRF保護などがミドルウェアとして実装されています。

settings.pyMIDDLEWARE に設定します。上から順にリクエストを処理し、下から順にレスポンスを処理します。

Python
# settings.py
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

デフォルトのミドルウェアは基本そのまま使えます。順番に意味があるので、特別な理由がない限り並び順は変えないようにしましょう。

まとめ

この記事ではDjangoのビューとURLルーティングの基本を解説しました。

  • ビューはリクエストを処理してレスポンスを返す関数・クラス
  • FBVはシンプルで読みやすく、CBVは定型的なCRUDを短く書ける
  • URLconfはアプリごとに分割してincludeでまとめる
  • URLには必ず name を付けてハードコードを避ける

ビューでデータをテンプレートに渡せるようになったら、次はテンプレートの書き方を学びましょう。

Djangoロードマップ全体はこちらから確認できます。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)