Django教程 - /polls/处的TemplateDoesNotExist
我试了无数次想让这个东西正常工作。放了一周没碰它,回来后又试了一遍。我在网上查了很多资料,读了所有相关的帖子。还让一些不懂的人在消息组里嘲笑我,但始终没找到答案。我只想让它正常运行。当我跟着Django教程的第三部分走,到了制作首页模板的那一步,结果在浏览器里查看时,出现了 TemplateDoesNotExist at /polls/
的错误。我检查了文件的归属,移动了文件位置,一直在 setting.py
里修改 TEMPLATES_DIR
。我还用命令查看文件内容,确保它是正常的。为了让这个东西工作,我甚至做了一些奇怪的仪式。现在我向你们求助。我知道这可能是个很傻的问题,我对此几乎没有怀疑。我只想让它正常工作。
我不确定你们需要哪些代码或错误信息,如果需要请告诉我,我会发给你们。我是在Ubuntu 10.10上做这个的。
编辑
来自 settings.py
的内容:
TEMPLATE_DIRS = (
"home/kevin/first/tutorial/temps"
)
这个文件以前在家目录里,但我把它移到了项目文件夹里,以为这样会有帮助。
文件结构(省略所有编译后的Python文件):
~/first/tutorial/:
__init__.py,
manage.py,
polls,
settings.py,
temps,
tut.db,
urls.py
temps:
index.html
polls:
admin.py,
__init__.py,
models.py,
tests.py,
views.py,
6 个回答
在我的 settings.py
配置文件中,我使用的是:
"TEMPLATE_DIRS = (
'/path/to/folder/Python-templates',
)"
这个设置是有效的。我猜测(如果我错了请纠正我)在django教程中的例子是指模板文件在模板文件夹中的具体位置,也就是 polls
文件夹。因此,在这个教程中的例子里,polls/index.html
这个文件路径的意思是“在 settings.py
中指定的模板文件夹里,polls
文件夹中的 index.html
文件”。
首先,这可能和你的问题无关,但在文件中不使用绝对路径是个好习惯。我在我的 settings.py
文件中总是这样写:
PROJECT_ROOT = os.path.realpath(os.path.dirname(__file__))
TEMPLATE_DIRS = (
os.path.join(PROJECT_ROOT, 'templates'),
)
在元组的每个元素后面都应该加一个逗号,即使它是唯一的一个或者最后一个,这样Python才能把它当作元组来处理,而不是变成其他类型。
你还需要确保你的 TEMPLATE_LOADERS
设置包含或者看起来像这样:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
如果这样做还是不行(不过上面的设置还是要保留),那么问题很可能和你正在渲染的模板有关。确认一下你在视图中使用的模板字符串和你 templates
目录下的模板相对路径是否对应。换句话说,如果在视图中模板字符串是 'polls/index.html'
,那么确保这个文件实际上位于 templates/polls/index.html
这个位置。
>>> TEMPLATE_DIRS = ( "home/kevin/first/tutorial/temps" )
>>> print TEMPLATE_DIRS
home/kevin/first/tutorial/temps
>>> type(TEMPLATE_DIRS)
<type 'str'>
这是一个字符串,不是元组。
TEMPLATE_DIRS = ( "home/kevin/first/tutorial/temps", )
那是一个元组。这是Python中的一个小陷阱。
此外,使用绝对路径而不是相对路径。