ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
クラスベースビュー (CBV) でテンプレートに値を渡す
Django のクラスベースビュー(Class-Based View, CBV)は、関数ベースビュー(FBV)よりも汎用ビュー(TemplateView / ListView / DetailView など)を継承して書くスタイルです。テンプレートに変数を渡したいときは get_context_data() をオーバーライドするのが基本パターンになります。
基本パターン: get_context_data
# views.py
from django.views.generic import TemplateView
class SampleView(TemplateView):
template_name = "sample.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Sample Title"
context["description"] = "This is a sample description."
return context{# templates/sample.html #}
<!DOCTYPE html>
<html>
<head><title>{{ title }}</title></head>
<body>
<h1>{{ title }}</h1>
<p>{{ description }}</p>
</body>
</html>
super().get_context_data(**kwargs) を必ず先に呼び出し、その辞書にキーを追加して return するのがポイントです。これを忘れると URL の名前付きキャプチャなど、Django が自動で詰める値が消えてしまいます。
簡単な値なら extra_context
動的に組み立てる必要のない静的な値だけなら、クラス属性 extra_context に dict を書くだけで十分です。
class SampleView(TemplateView):
template_name = "sample.html"
extra_context = {
"title": "Sample Title",
"description": "This is a sample description.",
}
リストや辞書を渡す
class SampleView(TemplateView):
template_name = "sample.html"
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["title"] = "Sample Title"
ctx["items"] = ["item1", "item2", "item3"]
ctx["user"] = {"name": "tarou", "age": 28}
return ctx<h1>{{ title }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<p>{{ user.name }} ({{ user.age }})</p>
URL から渡された値を取り出す
URL パターンに <int:pk> のような名前付きキャプチャがある場合、self.kwargs から取り出せます。
# urls.py
path("articles/<int:pk>/", views.ArticleView.as_view(), name="article"),
# views.py
class ArticleView(TemplateView):
template_name = "article.html"
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
article_id = self.kwargs["pk"]
ctx["article_id"] = article_id
return ctx
クエリ文字列から取り出す
class SearchView(TemplateView):
template_name = "search.html"
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["q"] = self.request.GET.get("q", "")
return ctx
ListView / DetailView は自動で渡される
汎用ビューを継承すると、もっと楽に変数が渡せます。
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" # デフォルトは object_list
paginate_by = 20
class ArticleDetailView(DetailView):
model = Article
template_name = "articles/detail.html"
context_object_name = "article" # デフォルトは object
ListView は object_list(または context_object_name で指定した名前)と paginator / page_obj を自動で渡し、DetailView は object を渡します。
FormView でフォームを渡す
from django.views.generic.edit import FormView
from .forms import ContactForm
class ContactView(FormView):
template_name = "contact.html"
form_class = ContactForm
success_url = "/thanks/"
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["page_title"] = "お問い合わせ"
return ctx
def form_valid(self, form):
# 送信処理
return super().form_valid(form)
FormView ではテンプレートに form という名前でフォームインスタンスが自動で渡ります。
よくある落とし穴
| 症状 | 原因 / 対処 |
|---|---|
| テンプレートに値が表示されない | super().get_context_data(**kwargs) を呼んでいない / 戻り値を return していない |
| 名前付きキャプチャが取れない | super() を呼ばずに自分で dict を作っている |
| self.request が None | as_view() 経由でないと self.request は設定されない(呼び方ミス) |
| extra_context が反映されない | get_context_data を独自に上書きしているとマージされない場合がある |
| パフォーマンスが悪い | get_context_data 内で重い処理をしている。get_queryset() で select_related / prefetch_related |
関数ベースビュー (FBV) との比較
# FBV: シンプルだが定型コードが多くなりがち
def sample(request):
return render(request, "sample.html", {
"title": "Sample Title",
"description": "This is a sample description.",
})
| 項目 | FBV | CBV |
|---|---|---|
| 記述量 | シンプル | クラス定義の分やや多い |
| 再利用性 | 低い | 継承・Mixin で高い |
| 汎用機能(一覧/詳細/フォーム) | 自分で書く | ListView / DetailView / FormView |
| 学習コスト | 低い | やや高い(MRO の理解が必要) |
関連
- ビュー — 親カテゴリ
- TemplateView / ListView / DetailView / FormView
- get_context_data / get_queryset / get_object
- Mixin(LoginRequiredMixin / UserPassesTestMixin)
- テンプレートタグ・フィルタ
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?