djangoのディレクトリ構造を大きく変更を加え、djangoサーバーを起動したところ、django.template.exceptions.TemplateDoesNotExist のエラーを発出し、原因を探るのに手間取ってしまいました。
原因はsettings.pyのテンプレートに関する設定ができていなかったことでした。
コンテンツ
環境
環境は以下になります。
・macOS Big Sur 11.3
・python 3.8
・django 2.2
エラーが起こった時の状況
状況としては、djangoのディレクトリ構造を劇的に変えてサーバーを立ち上げたときです。
構造変更後に以下のコマンドでサーバーを立ち上げました。
1 |
% python manage.py runserver |
そして、localhost( http://127.0.0.1:8000/ )を叩くと以下のエラー。
1 2 |
raise TemplateDoesNotExist(template_name, chain=chain) django.template.exceptions.TemplateDoesNotExist: index.html |
この場合、404エラーではないのでサーバー(django)までアクセスできていますが、テンプレートのパスがおかしいのかdjango内部が該当のファイル( ここで言えばindex.html )を見つけ出せていない状況です。
パスの関係を確認しながらディレクトリ構造を変えたので間違いないはずなのに!!
相対パスをこねくり回しても報われない!!
一体どうなっているんだ!!
原因
原因の箇所
- サーバー側まではアクセスが届いている
- 相対パスをこねくり回しても報われない
ということから察するに根本的なrootディレクトリの設定がおかしいのではないかと疑い、settings.pyを見直すことにしました。
settings.pyを何もいじってないのであれば、settings.pyのTEMPLATES定数はほぼ中間点に存在しています。
初期状態だと以下のような状態です。
settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] |
原因の答え
答えは、’DIRS’ という箇所にありました。
このDIRSというのは、ビューから指定されるテンプレート名に対してどのディレクトリ優先してテンプレートを探しに行くかという順番をリスト形式で指定します。
django2.2の初期状態は空白になっていますので、以下の通りきちんと指定してあげる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] |
うん。これできちんとlocalhost( http://127.0.0.1:8000/ )が想定通りの表示になりました。
おまけ(css)
上記のようにディレクトリ構造に変更を加えた場合CSSにも影響が出ている可能性があります。
CSSのルートディレクトリも同様にsettings.pyファイルに変更を加えましょう。
1 2 3 |
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] |
最後に
いかがでしたか。
以上が、「【django】TemplateDoesNotExistエラーが出た時のsettings.pyのテンプレートに関する設定」の紹介記事になります。
以上が、「djangoではじめてのインストールから起動してロケットを打ち上げるまで」の紹介記事になります。
プログラミング学習を効率良く進めるには…
私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。
そしてネットで調べていくうちに膨大な時間が過ぎていきました。
私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。
1. いつまでもダラダラとやらないで、目標を決定して短期集中する
2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう
.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。
カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?
また以下のリンク先ではdjango専用のプログラミングスクールをまとめ紹介しています。