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名称放在: