Django TemplateDoesNotExist?


162

我的本地计算机在Ubuntu 8.10上运行Python 2.5和Nginx,而Django是从最新的开发主干构建的。

对于我请求的每个URL,都会引发:

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

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就足够了。它是在正在运行的远程服务器上配置的。
杰克

Answers:


195

第一个解决方案

这些设定

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

第二种解决方案

如果仍然无法正常工作,并假设您已在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/吗?
约书亚·帕托吉

@jpartogi,是的,所有已安装的应用程序都在/usr/lib/python2.5/site-packages/projectname/appname1下,...
jack

您能否编辑您的原始帖子并粘贴settings.py。不包括数据库配置:-d。谢谢。
2009年

将来自不同应用程序的每个模板放在一个目录templates中并不是一个好的设计。但是,因为我知道,您加入后APP_NAMEsettings.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
播出时间:2016年

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

1
我认为Shapon Pal的意思是SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)),而不是归档
mic

20

如果您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

2,将您的添加appINSTALLED_APPS

修改 settings.py

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

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'),
                ...
                ]
    }
]

这是使用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.Loader在TEMPLATE_LOADERS列表中。


这对我有用。从文件系统上的Django应用加载模板。对于INSTALLED_APPS中的每个应用程序,加载程序将查找模板子目录。如果目录存在,则Django在其中查找模板。<br> TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates','APP_DIRS':True,}]
Vijay

4

使用l -l检查模板和appname目录的权限,或者尝试从django执行绝对路径open()。


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

对于Django版本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

Template-loader postmortem在错误页面上查看django尝试加载哪个文件夹的模板,例如,错误将如下所示:

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

我必须为内部APP使用模板,并且对我有用:

'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.html是否在/usr/lib/python2.5/site-packages/projectname/templates目录中。


0

嗨,大家好,我找到了一个新的解决方案。实际上,它是在另一个模板中定义的,因此,您无需自己定义TEMPLATE_DIRS,而是将目录路径名放在以下位置: 在此处输入图片说明


0

我很尴尬地承认这一点,但是对我来说,问题是模板指定为….hml而不是….html。小心!


0

我加了这个

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

并且仍然显示错误,然后我意识到在另一个项目中显示的模板没有在settings.py文件中添加该代码,因此我检查了该项目,并且意识到我没有在该项目中创建虚拟环境,所以我做了

virtualenv env 

而且有效,不知道为什么


0

我想到了这个问题。这是我解决的方法:

查看您的settings.py,找到TEMPLATESTEMPLATES内的变量,在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认为您需要知道的是您必须创建一个具有名称的文件夹,templates 并且该文件夹应位于根路径上,否则您必须更改该DIRS


0

1.在“应用程序”中创建一个文件夹“模板”(假设您为此类应用程序命名),然后可以将html文件放在此处。但是强烈建议在“模板”文件夹中创建一个具有相同名称(“ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.