Django TemplateDoesNotExist?

jac*_*ack 135 django

我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django是从最新的开发中继构建的.

对于我请求的每个URL,它会抛出:

TemplateDoesNotExist位于/​​ appname/path appname/template_name.html

Django尝试按以下顺序加载这些模板:*使用loader django.template.loaders.filesystem.function:*使用loader 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'),
)
Run Code Online (Sandbox Code Playgroud)

它应该寻找以下文件:

  • /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/*
Run Code Online (Sandbox Code Playgroud)

真奇怪.我不需要在远程服务器上执行此操作以使其工作.

Jos*_*ogi 168

第一个解决方案:

这些设置

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)
Run Code Online (Sandbox Code Playgroud)

意味着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
Run Code Online (Sandbox Code Playgroud)

二解决方案:

如果仍然无效,并假设您在settings.py中配置了这样的应用:

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)
Run Code Online (Sandbox Code Playgroud)

默认情况下,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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

SETTINGS_PATH默认情况下可能未定义.在这种情况下,您需要定义它(在settings.py中):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)

  • @jpartogi,我尝试了两种方法,但都不起作用.我甚至尝试在render_to_response()参数中使用绝对路径来模板,但仍然无效. (3认同)
  • Django TEMPLATE_DIRS 自 1.8 起已弃用,https://docs.djangoproject.com/en/1.8/ref/settings/#template-dirs (2认同)

小智 44

找到这个元组:

    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',
                ],
            },
        },
    ]
Run Code Online (Sandbox Code Playgroud)

您需要将'DIRS'添加到字符串中

"os.path.join(SETTINGS_PATH, 'templates')"
Run Code Online (Sandbox Code Playgroud)

所以你需要:

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',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

  • `SETTINGS_PATH`实际上并没有在任何地方定义,所以我认为这个答案不会起作用.也许你的意思是'BASE_DIR` (24认同)
  • 定义 SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)) (2认同)

jay*_*ngh 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',
        ],
    },
 },
]
Run Code Online (Sandbox Code Playgroud)


小智 10

2023 年 5 月更新:

\n

templates文件夹可以放在django-project文件夹下或每个app文件夹下,如下所示:

\n
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n |-app2\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n    |-app1\n    |  \xe2\x94\x94-a1.html\n    \xe2\x94\x94-app2\n       \xe2\x94\x94-a2.html\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n |  |-urls.py\n |  |-views.py\n |  \xe2\x94\x94-templates # Here\n |     \xe2\x94\x94-app1\n |        \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n    |-urls.py\n    |-views.py\n    \xe2\x94\x94-templates # Here\n       \xe2\x94\x94-app2\n          \xe2\x94\x94-a2.html\n
Run Code Online (Sandbox Code Playgroud)\n

例如,首先,您需要设置"app1"INSTALLED_APPS "app2"如下所示:settings.py

\n
# "core/settings.py"\n\nINSTALLED_APPS = [\n    ...\n    "app1",\n    "app2",\n]\n
Run Code Online (Sandbox Code Playgroud)\n

那么如果templates文件夹就在django-project文件夹下,如下所示:

\n
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n |-app2\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n    |-app1\n    |  \xe2\x94\x94-a1.html\n    \xe2\x94\x94-app2\n       \xe2\x94\x94-a2.html\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您需要在TEMPLATES中设置BASE_DIR / \'templates\'“DIRS”,如下所示。*我建议将文件夹放在文件夹下,如上所示,因为您可以在一个地方轻松管理模板:settings.pytemplatesdjango-project

\n
# "core/settings.py"\n\nTEMPLATES = [\n    {\n        "BACKEND": "django.template.backends.django.DjangoTemplates",\n        "DIRS": [\n            BASE_DIR / \'templates\' # Here\n        ],\n        "APP_DIRS": True,\n        "OPTIONS": {\n            "context_processors": [\n                "django.template.context_processors.debug",\n                "django.template.context_processors.request",\n                "django.contrib.auth.context_processors.auth",\n                "django.contrib.messages.context_processors.messages",\n            ],\n        },\n    },\n]\n
Run Code Online (Sandbox Code Playgroud)\n

并且,如果templates文件夹位于每个app文件夹下,如下所示:

\n
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n |  |-urls.py\n |  |-views.py\n |  \xe2\x94\x94-templates # Here\n |     \xe2\x94\x94-app1\n |        \xe2\x94\x94-a1.html\n \xe2\x94\x94-app2\n    |-urls.py\n    |-views.py\n    \xe2\x94\x94-templates # Here\n       \xe2\x94\x94-app2\n          \xe2\x94\x94-a2.html\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您需要保留"DIRS"为空(默认),而不设置BASE_DIR / \'templates\'"DIRS"in TEMPLATESsettings.py如下所示:

\n
# "core/settings.py"\n\nTEMPLATES = [\n    {\n        "BACKEND": "django.template.backends.django.DjangoTemplates",\n        "DIRS": [], # Keep it empty\n        "APP_DIRS": True,\n        "OPTIONS": {\n            "context_processors": [\n                "django.template.context_processors.debug",\n                "django.template.context_processors.request",\n                "django.contrib.auth.context_processors.auth",\n                "django.contrib.messages.context_processors.messages",\n            ],\n        },\n    },\n]\n
Run Code Online (Sandbox Code Playgroud)\n

然后,test()app1/views.py和 中定义app2/views.py,如下所示。请注意,您需要设置"app1/a1.html"and"app2/a2.html"而不是仅在render()"a1.html"中设置and ,如下所示:"a2.html"

\n
# "app1/views.py"\n\nfrom django.shortcuts import render\n\ndef test(request):         # Don\'t set just "a1.html"\n    return render(request, "app1/a1.html")\n
Run Code Online (Sandbox Code Playgroud)\n
# "app2/views.py"\n\nfrom django.shortcuts import render\n\ndef test(request):         # Don\'t set just "a2.html"\n    return render(request, "app2/a2.html")\n
Run Code Online (Sandbox Code Playgroud)\n

然后,设置和中test的各个视图,如下所示:app1app2app1/urls.pyapp2/urls.py

\n
# "app1/urls.py"\n\nfrom django.urls import include, path\n\nfrom . import views\n\napp_name = "app1"\n\nurlpatterns = [\n    path("", views.test, name=\'test\'), # Here\n]\n
Run Code Online (Sandbox Code Playgroud)\n
# "app2/urls.py"\n\nfrom django.urls import include, path\n\nfrom . import views\n\napp_name = "app2"\n\nurlpatterns = [\n    path("", views.test, name=\'test\'), # Here\n]\n
Run Code Online (Sandbox Code Playgroud)\n

然后,如下所示设置和中的每urls.py一个,然后和的模板将被渲染而不会出现任何错误:app1app2core/urls.pyapp1app2

\n
# "core/urls.py"\n\nfrom django.urls import include, path\n\nurlpatterns = [\n    ...\n    path("app1/", include(\'app1.urls\')), # Here\n    path("app2/", include(\'app2.urls\'))  # Here\n]\n
Run Code Online (Sandbox Code Playgroud)\n

最后,我再次建议将templates文件夹放在文件夹下django-project,如下所示,因为您可以在一个地方轻松管理模板:

\n
django-project\n |-core\n \xe2\x94\x82\xc2\xa0 |-settings.py\n \xe2\x94\x82\xc2\xa0 \xe2\x94\x94-urls.py\n |-app1\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n |-app2\n |  |-urls.py\n |  \xe2\x94\x94-views.py\n \xe2\x94\x94-templates # Here\n    |-app1\n    |  \xe2\x94\x94-a1.html\n    \xe2\x94\x94-app2\n       \xe2\x94\x94-a2.html\n
Run Code Online (Sandbox Code Playgroud)\n


Kri*_* PC 9

从在版本上测试的 Django 版本开始3,您需要将新应用程序添加到已安装的应用程序中。django 应用程序不需要更改其他代码

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'addyourappnamehere'
]
Run Code Online (Sandbox Code Playgroud)


Chr*_*lan 8

我遇到了一个尴尬的问题...

我收到此错误是因为我匆忙而忘记将应用程序放入INSTALLED_APPS. 您会认为 Django 会引发更具描述性的错误。


W.P*_*rin 7

如果您app从头开始添加时遇到此问题。可能是因为您错过了一些settings。添加时需要三个步骤app

1?创建目录和模板文件。

假设您有一个名为的项目,mysite并且想要添加一个appnamed 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
Run Code Online (Sandbox Code Playgroud)

2?将您添加appINSTALLED_APPS

修改 settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]
Run Code Online (Sandbox Code Playgroud)

3?将app目录添加到DIRSTEMPLATES

修改settings.py

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
Run Code Online (Sandbox Code Playgroud)

  • 我的应用程序刚刚从“INSTALLED_APPS”中丢失,谢谢! (3认同)
  • 就我而言,只缺少第 2 步。DIRS 数组我可以将其留空,它仍然可以工作并在应用程序的正确模板目录中查找模板。 (2认同)

ken*_*orb 5

DjangoTemplateDoesNotExist错误仅仅意味着框架找不到模板文件。

要使用模板加载 API,您需要告诉框架您存储模板的位置。执行此操作的位置是settings.py通过设置在您的设置文件 ( )中TEMPLATE_DIRS。默认情况下它是一个空元组,因此此设置告诉 Django 的模板加载机制在哪里查找模板。

选择您想要存储模板的目录并将其添加到 TEMPLATE_DIRS 例如:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
Run Code Online (Sandbox Code Playgroud)


Kap*_*man 5

对于 Django 1.9 版,我添加了

'DIRS': [os.path.join(BASE_DIR, 'templates')], 
Run Code Online (Sandbox Code Playgroud)

行到 settings.py 中的 Templates 块,它运行良好