Django TemplateDoesNotExist?


163

私のローカルマシンは、Ubuntu 8.10でPython 2.5とNginxを実行しており、Djangoは最新の開発トランクからビルドされています。

私が要求するすべてのURLに対して、それはスローします:

/ appname / path appname / template_name.htmlのTemplateDoesNotExist

Djangoはこれらのテンプレートを次の順序でロードしようとしました:*ローダーdjango.template.loaders.filesystem.functionを使用:*ローダーdjango.template.loaders.app_directories.functionを使用:

TEMPLATE_DIRS( '/usr/lib/python2.5/site-packages/projectname/templates'、)

この場合、/ usr / lib / python2.5 / site-packages / projectname / templates / appname / template_name.htmlを探していますか?奇妙なことに、このファイルはディスク上に存在します。なぜDjangoはそれを見つけられないのですか?

そのような問題なしに、Ubuntu 9.04でPython 2.6を実行しているリモートサーバーで同じアプリケーションを実行します。他の設定は同じです。

ローカルマシンの設定に誤りがあるか、または調査する必要があるようなエラーを引き起こした可能性があるものは何ですか?

私のsettings.pyで、私は指定しました:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
# Find templates in the same folder as settings.py.
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

次のファイルを探しているはずです。

  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html
  • ...

上記のファイルはすべてディスク上に存在します。

解決した

私が試した後それは今動作します:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

それは変だ。これを動作させるためにリモートサーバーでこれを行う必要はありません。


TEMPLATE_DIRSはウェブサーバーから読み取り可能ですか?
ジョーダンメッシーナ、

@Jordan、ルートからアクセス可能なTEMPLATE_DIRSで十分です。これは、動作しているリモートサーバーで構成されているものです。
ジャック、

回答:


196

最初の解決策

これらの設定

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

つまり、Djangoはtemplates/プロジェクトの下のディレクトリからテンプレートを調べます。

あなたのDjangoプロジェクトがその場所にあると仮定すると、/usr/lib/python2.5/site-packages/projectname/djangoは以下のテンプレートを探します/usr/lib/python2.5/site-packages/projectname/templates/

その場合は、テンプレートを次のように構成する必要があります。

/usr/lib/python2.5/site-packages/projectname/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/templates/template3.html

2番目のソリューション

それでも機能しない場合は、settings.pyでアプリを次のように構成していると想定します。

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)

デフォルトでは、Djangoはtemplates/インストールされているすべてのアプリの下のディレクトリにあるテンプレートを読み込みます。したがって、ディレクトリ構造を使用して、テンプレートを次のように移動します。

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html

SETTINGS_PATHデフォルトでは定義されていない場合があります。その場合は、(settings.pyで)定義する必要があります。

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

3
@jpartogi、私は両方のアプローチを試しましたが、どちらもうまくいきませんでした。render_to_response()引数でテンプレートへの絶対パスを使用することさえ試みましたが、それでも機能しませんでした。
ジャック

あなたのdjangoプロジェクトは下にあり/usr/lib/python2.5/site-packages/projectname/ますか?
Joshua Partogi、2009

はい、@jpartogi、インストールされているすべてのアプリが/usr/lib/python2.5/site-packages/projectname/appname1下にあり、...
ジャック

元の投稿を編集して、settings.pyを貼り付けてください。DB構成を除外します:-d。ありがとう。
ジョシュア・パルトギ2009

さまざまなアプリのすべてのテンプレートを1つのディレクトリに配置するのtemplatesは良い設計ではありません。しかし、私が知っているように、あなたの追加した後APP_NAMEにはsettings.pydjango下にあるディレクトリの下のアプリのテンプレートを検索するために行くかもしれませんAPP_DIR。したがって、さまざまなアプリのテンプレートを分離できます。(Django 1.7-.1.9
Alston

59

このタプルを見つけます:

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

    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」に文字列を追加する必要があります

"os.path.join(SETTINGS_PATH, 'templates')"

だからあなたは完全にあなたが必要です:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(SETTINGS_PATH, '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',
            ],
        },
    },
]

24
SETTINGS_PATH実際にはどこにも定義されていないので、この答えがうまくいくとは思いません。多分あなたが意味したかもしれないBASE_DIR
21:05にソフライ

1
define SETTINGS_PATH = os.path.dirname(os.path.dirname(file))
Shapon Pal

1
Shapon PalはファイルSETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))ではなくを意味すると思います
マイク

20

app最初からを追加するときにこの問題が発生した場合。それはあなたがいくつかを逃しているからだろうsettings。を追加するには、3つの手順が必要ですapp

1、ディレクトリとテンプレートファイルを作成します。

という名前のプロジェクトがあり、という名前のプロジェクトmysiteを追加するappとしyour_app_nameます。mysite/your_app_name/templates/your_app_name次のようにテンプレートファイルを配置します。

├── mysite
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── your_app_name
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── templates
      └── your_app_name
          └── my_index.html
   ├── urls.py
   └── views.py

2、あなたの追加appにはINSTALLED_APPS

修正 settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3、あなたの追加appにディレクトリをDIRSの中でTEMPLATES

変更しsettings.pyます。

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

これは、django 2.2.7を使用して動作する唯一のソリューションでした
Jhonatas Kleinkauff

1
私の場合、ステップ2だけがありませんでした。DIRS配列は空のままでもかまいませんが、それでも機能し、アプリの適切なテンプレートディレクトリでテンプレートを探しました。
Shri Shinde

13

設定.pyでTEMPLATE_LOADERSとTEMPLATE DIRSを削除してから追加

TEMPLATES = [
 {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['/home/jay/apijay/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',
        ],
    },
 },
]

5

私は恥ずかしい問題を抱えていました...

急いでアプリをに入れるのを忘れたため、このエラーが発生しましたINSTALLED_APPS。Djangoはより記述的なエラーを発生させると思います。


4

ちょっとした勘違いですが、Djangoテンプレートのロードに関するこの記事をチェックしてください。特に、django.template.loaders.app_directories.LoaderTEMPLATE_LOADERSリストにあることを確認してください。


これでうまくいきました。ファイルシステム上のDjangoアプリからテンプレートを読み込みます。INSTALLED_APPSの各アプリについて、ローダーはテンプレートサブディレクトリを探します。ディレクトリが存在する場合、Djangoはそこからテンプレートを探します。<br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates'、 'APP_DIRS':True、}]
Vijay

4

ls -lを使用するか、djangoから絶対パスopen()を実行して、テンプレートおよびappnameディレクトリの権限を確認します。


4

私が試した後それは今動作します

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

それは変だ。これを機能させるために、リモートサーバーでこれを行う必要はありません。

また、すべての静的ファイルにアクセスできるようにするには、ローカルマシンで次のコマンドを実行する必要がありますが、リモートサーバーではすべて "root:root"です。

chown -R www-data:www-data /var/www/projectname/*

ローカルマシンはUbuntu 8.04デスクトップエディションで動作します。リモートサーバーはUbuntu 9.04サーバーエディション上にあります。

誰かが理由を知っていますか?


4

ジャンゴバージョン1.9の場合、私は追加しました

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

settings.pyのTemplatesブロックへの行そして、それはうまくいきました


3

Django TemplateDoesNotExistエラーは、フレームワークがテンプレートファイルを見つけられないことを意味します。

テンプレート読み込みAPIを使用するには、テンプレートを保存する場所をフレームワークに通知する必要があります。これを行う場所は、設定settings.pyによってTEMPLATE_DIRS設定ファイル()にあります。デフォルトでは空のタプルなので、この設定はDjangoのテンプレート読み込みメカニズムにテンプレートを探す場所を指示します。

テンプレートを保存するディレクトリを選択して、TEMPLATE_DIRSに追加します。例:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)

1

djangoがテンプレートを読み込もうとするフォルダTemplate-loader postmortemをエラーページで確認してください。たとえば、エラーは次のようになります。

Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)

私のエラーでvcsrc\vcsrc\templates\base.htmlはパスではありません。
次にTEMPLATESsetting.pyファイルをテンプレートパスに変更します。

TEMPLATES = [
    {    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         # 'DIRS': [], 
        'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
        ...

1

私は内部アプリのテンプレートを使用する必要があり、それは私のために機能します:

'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],

1

アプリがproject-name/app-namme/settings.py INSTALLED_APPS:に追加されていることを確認してください。

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

そして、上の project-name/app-namme/settings.py テンプレート:

'DIRS': [os.path.join(BASE_DIR, 'templates')],


0

こんにちは私は新しい解決策を見つけました。実際には別のテンプレートで定義されているため、TEMPLATE_DIRSを自分で定義する代わりに、ディレクトリパス名を次の場所に配置します。 ここに画像の説明を入力してください


0

これを認めるのは恥ずかしいですが、問題はテンプレートがの….hml代わりにとして指定されていることでした….html。気を付けて!


0

これを追加しました

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

それでもエラーが表示された後、別のプロジェクトでsettings.pyファイルにコードを追加せずにテンプレートが表示されていることに気付いたので、そのプロジェクトを確認し、このプロジェクトで仮想環境を作成していないことに気付いたので、

virtualenv env 

そしてそれはうまくいった、理由はわからない


0

私はこの問題を思いつきました。これが私がこれを解決した方法です:

settings.pyを見TEMPLATESて、TEMPLATES内の変数を見つけ、DIRSリスト内にテンプレートパスを追加します。私の場合、最初にテンプレートパスをに設定しTEMPLATES_PATH = os.path.join(BASE_DIR,'templates')、次にリストに追加TEMPLATES_PATHDIRSます'DIRS':[TEMPLATES_PATH,]。次にサーバーを再起動すると、TemplateDoesNotExist例外がなくなります。それでおしまい。


0

あなたのsetting.pyファイルでこれDIRSTEMPLATES配列で置き換えます

'DIRS': []

これに

'DIRS': [os.path.join(BASE_DIR, 'templates')],

しかし、1つは、uが名前templates でフォルダを作成する必要があり、ルートパス上にある必要があることを知っておく必要があると考えます。それ以外の場合は、DIRS値を変更する必要があります。


0

1. 'apps'に 'templates'フォルダーを作成し(そのようなアプリに名前を付けたとしましょう)、ここにhtmlファイルを置くことができます。ただし、「templates」フォルダーに同じ名前(「app」)のフォルダーを作成し、そこにHTMLを置くことを強くお勧めします。「app / templates / app」フォルダに

2. 'app'のurls.pyに次を追加:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. 'app'のviews.pyに次のように入力します。

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.