我的本地机器运行Python 2.5和Ubuntu 8.10上的Nginx, Django是根据最新的开发主干构建的。

对于我请求的每个URL,它抛出:

TemplateDoesNotExist at /appname/path appname/template_name.html Django尝试加载这些模板,顺序如下: 使用loader django.template.loaders. filessystem .function: 使用loader django.template.loaders.app_directories.function: TEMPLATE_DIRS (“/ usr / lib / python2.5 /网站/ projectname /模板”,)

在这种情况下,它是否在寻找/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 /模板/ appname1 / template1.html /usr/lib/python2.5/site-packages projectname /模板/ appname1 / template2.html /usr/lib/python2.5/site-packages projectname /模板/ appname2 / template3.html ...

以上所有文件都存在于磁盘上。

解决了

在我尝试之后,它现在工作了:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

这是奇怪的。我不需要在远程服务器上执行此操作即可使其工作。


当前回答

这只是一种直觉,但是看看这篇关于Django模板加载的文章。特别地,确保你有django.template.loaders.app_directories。在TEMPLATE_LOADERS列表中的Loader。

其他回答

我遇到了一个尴尬的问题……

我得到这个错误,因为我匆忙,忘记把应用程序在INSTALLED_APPS。您可能会认为Django会抛出一个描述性更强的错误。

我加上了这个

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

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

virtualenv env 

它成功了,不知道为什么

第一个解决方案:

这些设置

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会在每个已安装应用的模板/目录下加载模板。所以在你的目录结构中,我们想要移动我们的模板,就像这样:

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

从Django版本3测试开始,你需要将你的新app添加到已安装的app中。对于一个Django app,不需要修改其他代码

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'addyourappnamehere'
]

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

查看settings.py,找到TEMPLATES变量, 在TEMPLATES中,在DIRS列表中添加你的模板路径。对我来说,首先我将模板路径设置为TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'),然后将TEMPLATES_PATH添加到DIRS列表,' DIRS':[TEMPLATES_PATH,]。 然后重新启动服务器,TemplateDoesNotExist异常消失。 就是这样。