问题
根据django 文档,模板加载器“django.template.loaders.app_directories.Loader”通过在INSTALLED_APPS和
...并将使用它首先找到的那个。
但是,我很难理解为什么这与 django 拥有独立应用程序的精神一致。让我们看一个例子。
例子
考虑使用模板子目录的 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 文档中所指出的那样
INSTALLED_APPS的顺序很重要!
作为安装在网站主页应用程序顶部(在 INSTALLED_APPS 中)的应用程序,如果存在模板名称冲突,则可以“重载”其模板。
这使得 django 的应用程序系统有点“奇怪”,因为每个应用程序都必须具有不与其他应用程序冲突的模板,即使程序员知道,由于目录的层次结构,哪些模板属于哪个应用程序。
问题
有没有办法解决这个问题?这个问题是否在 Django 社区中讨论过,或者是否有任何加载程序可以解决这个问题?