- DjangoのビューとURLの関係がよくわからない
- 関数ベースビューとクラスベースビューの違いを知りたい
- URLconfの書き方をマスターしたい
この記事ではDjangoのビューとURLルーティングの仕組みを解説します。関数ベースビュー(FBV)とクラスベースビュー(CBV)の使い分け、URLconfの書き方、よく使うビューパターンをひとつの記事でまとめています。
この記事を読む前に
- Djangoのプロジェクト・アプリ構成を理解していること
- モデルの基本的な書き方を知っていること
ビューとURLルーティングの仕組み
Djangoでリクエストがどう処理されるかを理解しておくと、ビューの役割が見えてきます。
- ブラウザからリクエストが届く
- URLconfがURLを照合して、対応するビュー関数を呼び出す
- ビューがリクエストを処理してレスポンスを返す
- レスポンスがブラウザに返される
ビューは「リクエストを受け取ってレスポンスを返す関数(またはクラス)」です。URLconfは「どのURLにどのビューを対応させるか」を定義するものです。
関数ベースビュー(FBV)
最もシンプルなビューの書き方です。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を同じビューで処理するパターンです。
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で書き直すとこうなります。
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"FBVとCBVの使い分け
| FBV | CBV | |
|---|---|---|
| コード量 | 多め | 少なめ(定型処理なら) |
| 読みやすさ | 処理の流れがわかりやすい | 継承関係を把握する必要がある |
| カスタマイズ | 自由に書ける | メソッドオーバーライドで対応 |
| 向いている場面 | 複雑なロジック・例外的な処理 | 標準的なCRUD・一覧・詳細 |
迷ったらFBVで書いて、「同じような処理を何度も書いているな」と感じたときにCBVへ切り替えるのが現実的です。
URLconf(urls.py)
URLconfはURLとビューのマッピングを定義するファイルです。アプリごとに urls.py を作り、プロジェクトのルートURLconfに include() でまとめるのが定番の構成です。
アプリのurls.py
# 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
# 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のパスパラメータには型を指定できます。
| コンバータ | マッチするもの | 例 |
|---|---|---|
int | 0以上の整数 | <int:pk> |
str | スラッシュを除く任意の文字列 | <str:slug> |
slug | ASCII文字・数字・ハイフン・アンダースコア | <slug:slug> |
uuid | UUID形式 | <uuid:id> |
path | スラッシュを含む任意の文字列 | <path:filepath> |
URL名前解決(reverse・url タグ)
name を設定したURLは、ビューやテンプレートからURLをハードコードせずに参照できます。
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.py の MIDDLEWARE に設定します。上から順にリクエストを処理し、下から順にレスポンスを処理します。
# 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ロードマップ全体はこちらから確認できます。

コメント