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