django generics的正确模板位置?

时间:2014-09-10 14:24:05

标签: python django templates

根据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的文档并不表示您需要它(并且还尝试删除该选项)。

发生了什么?有什么我做错了吗?它是关于通用视图的东西,还是还有其他东西在进行?

1 个答案:

答案 0 :(得分:3)

您的问题是Django基于通用类的视图的自动模板命名。如果您使用django.views.generic.ListView,则会获得MultipleObjectTemplateResponseMixin,其中会创建您的模板名称www/poll_list.html。此名称与app_directory Loader生成的前缀相结合,因此您获得/path/to/project/app/templates/www/poll_list.html

如果你不想要这个,你有不同的选择(按此顺序):

  • 在视图中使用template_name参数或属性。
  • 将MultipleObjectTemplateResponseMixin子类化并删除应用前缀。然后将它混合在你的视图中。
  • 请勿使用app_directory加载程序。