我的本地计算机在Ubuntu 8.10上运行Python 2.5和Nginx,并且Django是从最新的开发主干构建的。
对于我请求的每个URL,都会引发:
`TemplateDoesNotExist at /appname/path appname/template_name.html
Django tried loading these templates, in this order: * Using loader django.template.loaders.filesystem.function: * Using 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'), )
它应该寻找以下文件:
以上所有文件都存在于磁盘上。
解决了
经过尝试,现在可以使用:
chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*
真奇怪。我不需要在远程服务器上执行此操作即可使其正常工作。
第一个解决方案:
这些设定
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/
/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__))