ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?