根据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社区讨论过的,还是有任何加载器可以解决这个问题?
答案 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