根据Django Docs,模板加载器将
从文件系统上的Django应用程序加载模板。对于INSTALLED_APPS中的每个应用程序,加载程序都会查找模板子目录。
继续:
...然后get_template(' foo.html')将按以下顺序在这些目录中查找foo.html:
/path/to/myproject/polls/templates/
/path/to/myproject/music/templates/
所以...在我的" 网站"项目,我有一个" www "应用程序。所以目录结构是 / path / to / project / website / www /
我创建了一个" 模板"目录内" www ",然后放在" page_list.html " (的 /path/to/project/website/www/page_list.html )
该应用程序列在" INSTALLED_APPS"内,但当我尝试在urls.py中执行此操作时:
url('^$', ListView.as_view(model=Page,))
我得到" TemplateDoesNotExist ",错误说 django.template.loaders.app_directories.Loader 正在寻找"的 /path/to/project/website/templates/www/page_list.html "或 /path/to/project/website/www/templates/www/page_list.html
如果我将模板放在 website / www / templates / www 中,它可以工作......但我想知道为什么它会这样工作。在app文件夹中有一个 templates 文件夹似乎很荒谬,然后在模板目录中有另一个名为应用程序的文件....
文档说应该查看 project / app / templates ... 我有
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
尽管app_directories.Loader的文档并不表示您需要它(并且还尝试删除该选项)。
发生了什么?有什么我做错了吗?它是关于通用视图的东西,还是还有其他东西在进行?
答案 0 :(得分:3)
您的问题是Django基于通用类的视图的自动模板命名。如果您使用django.views.generic.ListView
,则会获得MultipleObjectTemplateResponseMixin,其中会创建您的模板名称www/poll_list.html
。此名称与app_directory Loader生成的前缀相结合,因此您获得/path/to/project/app/templates/www/poll_list.html
。
如果你不想要这个,你有不同的选择(按此顺序):