スポンサーリンク

【Django】html表示でハマった「TemplateDoesNotExist」エラーの主な原因と解決方法。

Django
スポンサーリンク

今回の記事は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関連の記事を記載しているので興味がある方は是非サイト内見ていってください。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

Django
スポンサーリンク
スポンサーリンク

コメント

  1. […] この4つに関してはこちらのサイトが参考になると思います。 […]

タイトルとURLをコピーしました