| この記事の要点 |
|
結論: テンプレートはアプリ名のフォルダに入れる
template_name = 'index.html'
return render(request, template_name)
Django において上記のように単に index.html を指定するだけでは非常に危険です。異なるアプリに同名の index.html が存在すると、意図しない index.html が読み込まれる可能性があります。テンプレート名を指定する場合は、アプリケーション名込みで指定します。
template_name = 'calculator/index.html'
return render(request, template_name)
原因: Django のテンプレート検索の仕組み
Django は settings.py の TEMPLATES 設定に従ってテンプレートを探します。標準的な設定は次のとおりです。
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
# 省略
],
},
},
]
この設定では、render(request, 'index.html') と書くと、Django は次の順番で index.html を探します。
DIRSに書いたフォルダ(この例ではプロジェクト直下の templates)APP_DIRSが True の場合、INSTALLED_APPSに書かれた順に、各アプリのtemplatesフォルダ
そして最初に見つかったファイルを使い、残りは見ません。ここで重要なのは、アプリの templates フォルダはアプリごとに分離されているわけではなく、すべて 1 つの検索対象としてまとめて扱われる点です。
たとえば blog/templates/index.html と calculator/templates/index.html があり、INSTALLED_APPS で blog が先に書かれていると、calculator アプリのビューで 'index.html' を指定しても blog の index.html が表示されます。エラーにならないため、気づきにくいのが厄介な点です。
対処法: テンプレートを名前空間化する
まずテンプレートディレクトリの配置構造を次のようにします。templates フォルダの中に、もう一度アプリ名のフォルダを作るのがポイントです。
プロジェクト名/
manage.py
プロジェクト名/
settings.py
calculator/
templates/
calculator/
index.html
blog/
templates/
blog/
index.html
少し冗長ですが、静的ファイル(static)のディレクトリ構造と同様に、テンプレートもこの構造にするのが Django 公式チュートリアルでも推奨されている方法です。フォルダ名は templates(複数形)でなければ APP_DIRS の検索対象になりません。
ビューからの呼び出しは次のように、サブフォルダ名を含めて指定します。
from django.shortcuts import render
def index(request):
return render(request, "calculator/index.html")
テンプレート同士の継承や読み込みでも同じです。
{% extends "calculator/base.html" %}
{% include "calculator/_form.html" %}
クラスベースビューの既定テンプレート名
ListView や DetailView などの汎用ビューは、template_name を指定しないと アプリ名/モデル名_list.html のような名前を自動で使います。最初からアプリ名のフォルダを前提にした命名になっているため、名前空間化の構成と相性が良くなっています。
あえて同名テンプレートで上書きする使い方
この「最初に見つかったものが勝つ」仕組みは、逆に他のアプリのテンプレートを上書きするために使われます。たとえば Django 管理画面のテンプレートを変更したいときは、プロジェクトの templates フォルダに admin/base_site.html を置くと、DIRS が先に検索されるため django.contrib.admin 本来のテンプレートより優先されます。
同名の衝突は、このような意図的な上書きのときだけ起こるように構成しておくのが理想です。
よくある落とし穴
- フォルダ名が template(単数形): APP_DIRS は
templatesだけを探すため、TemplateDoesNotExist になる - アプリを INSTALLED_APPS に追加していない: 追加していないアプリの templates は検索されない
- 共通テンプレートの置き場所: base.html のように全アプリ共通のものは、プロジェクト直下の templates(DIRS)に置き、アプリ固有のものと分ける
- INSTALLED_APPS の順番を変えたら表示が変わった: 名前空間化されていない同名テンプレートがある証拠。サブフォルダ構成に直す
- 拡張子の違い: index.htm と index.html は別のファイルとして扱われる。指定と実ファイル名を一致させる
確認方法: どのテンプレートが使われたか調べる
python manage.py shell で次を実行すると、その名前で実際に読み込まれるファイルのパスが分かります。
from django.template.loader import get_template
t = get_template("index.html")
print(t.origin.name)
また、存在しない名前を指定したときの TemplateDoesNotExist エラー画面(DEBUG=True)には「Template-loader postmortem」が表示され、どのフォルダをどの順で探したかが一覧で確認できます。開発中は django-debug-toolbar の Templates パネルでも、使われたテンプレートのパスを確認できます。
関連
- Django Context Processor 完全ガイド(全テンプレに共通変数を注入)
- Django ルーティング (URLconf) 作成完全ガイド
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context
- テンプレートエンジン完全ガイド
子ページはありません
人気ページ
- 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 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09