根据app加载django模板

时间:2013-05-15 07:08:00

标签: django django-templates

问题

根据django documentation,模板加载器'django.template.loaders.app_directories.Loader'通过搜索INSTALLED_APPS

来加载模板
  

...并将使用它首先找到的那个。

但是,我很难理解为什么这与django拥有自包含应用程序的精神一致。我们来看一个例子。

实施例

考虑使用templates subdirectories的django-“首选”方法。

root/
-manage.py
-main/settings.py
-main/urls.py
-main/views.py
-main/templates/base.html
-main/templates/base/header.html
-main/templates/base/secondary_header.html
-main/app1/base_extension.html
-main/app1/base/secondary_header.html

自然在main /和main / app1 /.

中使用 init .py

由于我使用的是标准模板目录名,因此我只需要使用TEMPLATE_LOADERS中的app_directories.Loader。

考虑以下base.html和base_extension.html:

#base.html
{% include "header.html" %}
{% block secondary_header %}{% include "base/secondary_header.html" %}{% endblock %}

#base_extension.html
{% extends "base.html" %}
{% block secondary_header %}{% include "base/secondary_header.html" %}{% endblock %}

根据django的精神,我希望如果渲染base.html,它会使用main的secondary_header(main / templates / base / header.html),但是如果渲染了base_extension.html,则secondary_header.html应该是来自app1的特定一个(main / app1 / base / secondary_header.html)。由于上面引用的文字,这不会发生。

这个问题可能很危险,在django documentation

中也有提及
  

INSTALLED_APPS的顺序很重要!

如果存在模板名称冲突,则网站主页应用程序顶部(在INSTALLED_APPS中)的已安装应用程序可以“重载”其模板。

这使得django的应用程序系统有点“奇怪”,因为每个应用程序必须具有不与其他应用程序冲突的模板,即使程序员知道,由于目录的层次结构,哪些模板属于哪个应用程序。

问题

有什么方法可以解决这个问题吗?这个问题是在Django社区讨论过的,还是有任何加载器可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

只需在应用模板上添加应用名称前缀即可。这在许多方面都是最佳实践,它也将解决这个问题。我使用以下结构:

project/app1/templates/app1__base.html
project/app1/templates/app1__header.html
project/app1/templates/app1_main.html
project/templates/_base.html
project/templates/_header.html
project/app2/templates/app2__base.html