Django TemplateDoesNotExist?

我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django由最新的开发主干构build而成。

对于我请求的每一个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不能find它?

我使用Ubuntu 9.04上的Python 2.6在远程服务器上运行相同的应用程序,没有这个问题。 其他设置是相同的。

在我的本地机器上是否有任何configuration错误,或者有什么可能导致这样的错误,我应该看看?

在我的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/*

真奇怪。 我不需要在远程服务器上做这个工作。

第一个scheme

这个设置TEMPLATE_DIRS = ( os.path.join(SETTINGS_PATH, 'templates'), )意味着django将查看项目下templates/目录下的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 

解决scheme二

如果这仍然不起作用,并假设你已经在settings.py中configuration了这样的应用程序:

 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__)) 

find这个元组:

 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'的string

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

在设置.py中删除 TEMPLATE_LOADERS和TEMPLATE DIRS然后ADD

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

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

现在,我尝试后,它的作品

 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服务器版上。

有人知道为什么吗?

只是一个预感,但看看这篇关于Django模板加载的文章 。 尤其要确保在TEMPLATE_LOADERS列表中有django.template.loaders.app_directories.Loader

Django的TemplateDoesNotExist错误意味着框架无法find模板文件。

要使用模板加载API,您需要告诉框架存储模板的位置。 在TEMPLATE_DIRS设置下,您可以在设置文件( settings.py )中find这个位置。 默认情况下它是一个空元组,所以这个设置告诉Django的模板加载机制在哪里寻找模板。

select一个您想要存储模板的目录,并将其添加到TEMPLATE_DIRS,例如:

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

对于django版本1.9,我补充道

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

行到settings.py中的模板块,它运作良好

检查您的templates.html是否在/usr/lib/python2.5/site-packages/projectname/templates目录中。

看看哪个文件夹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不在path。
然后将setting.py文件中的TEMPLATES改为您的模板path

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

嗨,大家好我发现了一个新的解决 实际上,它是在另一个模板中定义的,所以不要自己定义TEMPLATE_DIRS,而要将目录path名称放在: 在这里输入图像说明