今回の記事はDjangoプロジェクトでhtml表示を行う際に「TemplateDoesNotExist」エラーが起きる主な原因4選と解決策に関してご紹介する記事です。Django初心者はよく通る道なので焦らずに原因と解決策を理解しておきましょう。是非参考にしてみてください。
TemplateDoesNotExistの原因
TemplateDoesNotExistとは?
このエラーの意味はページがないという読んでそのままの意味です。指定のurl先にページの格納が行われていない、もしくはそのURL先のページをうまく拾えていないことが原因です。
ページにあたるhtmlファイルのパスが正しいかを確認しておきましょう。
ちなみに私はtremplatesフォルダはアプリケーションフォルダではなく全て外部にあるように設定しています。
このエラーの原因は主に3つあります。
・settings.pyのtemplateに対する記述がない
・ページ指定が間違っている
・templatesフォルダの場所が悪い
順番に詳しく見ていきます。
settings.pyのtemplateに対する記述がない
templatesフォルダの下に今からhtmlを入れていくという宣言が足りていません。
下記のように’DIRS’に記述「os.path.join(BASE_DIR,’templates’)」を追加することでこちらは解決です。これはtemplatesフォルダをどこに設置しようとも必要な処理なので記述を付け加えてください。
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',
],
},
},
]
ページ指定が間違っている
こちらは下記2点に分けられます。
- views.pyのrender関数等のページを指定するものの指定の仕方が悪い
- urls.pyの記述が悪く、views関数がうまく拾えていない。
上記二つの原因に関しては密接につながっていますので一度にご紹介します。
render関数とはviews.py内の頻出関数なのですが、要は指定のurl先のファイルに飛ばしてくれる関数です。その関数を使う地点(URL)を指定する必要があるのですが仮に下記のように記述するとして解説していきます。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index_show, name='index_show'),
]
from django.shortcuts import render
from . import forms
def index_show(request):
form = playerForm()
return render(request,'index.html')
こちらのurls.pyでは現在templatesフォルダに存在するindex.htmlにlocalのURL(http://127.0.0.1:8000)にアクセスがあればindex_show関数を使用してその中にある関数renderによりindex.htmlに飛ばすという内容になっている。
この場合は特にtemplatesの記述がないのでわかりづらいかもしれないが、仮にこのindex.html上にviews.pyに追加で記述した関数が関与してくる場合その関数が使用されるのはローカルURL(http://127.0.0.1:8000)ではなくtemplatesフォルダ内(http://127.0.0.1:8000/templates)ということになる。
例としてページ内にボタンクリック で別ページに飛ばす関数を付け加えた場合、下記の記述です。
def index_show(request):
form = playerForm()
return render(request,'index.html',{
'form': form,
})
def move_to_gamepage(request):
form = forms.playerForm(request.GET or None)
if form.is_valid():
players = {
'player1': request.GET.get('player1'),
'player2': request.GET.get('player2'),
'player3': request.GET.get('player3'),
}
return render(request, 'gamepage.html', players)
この場合の関数move_to_gamepageが発動する場所はtemplatesフォルダ内なのでurls.pyは下記になる。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index_show, name='index_show'),
path('templates/', views.move_to_gamepage, name='move_to_gamepage'),
]
関数が増えたということで追加した二段目のpathの第一因数として発動フォルダをtemplatesに指定している。
このようにviews関数ないに作成した関数がどこのページで発動するかによってこの2つの問題は関係してくるので注意しましょう。
templatesフォルダの場所が悪い
アプリケーション内にtemplatesフォルダを作る場合は、上記で述べた内容と照らし合わせ、関数の使用場所によって「urls.py」の第1因数を変化させる、または、「views.py」のrennder関数のページ指定のパスを変える必要があります。
TemplateDoesNotExistまとめ
このエラーに関しては初めは誰しも通る道ですので何も気に留める必要はありません。間違いを犯すことで今後覚えておけると思います。
では今回の記事は以上です。ほかにもDjango関連の記事を記載しているので興味がある方は是非サイト内見ていってください。
コメント
[…] この4つに関してはこちらのサイトが参考になると思います。 […]