0

问题

根据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 社区中讨论过,或者是否有任何加载程序可以解决这个问题?

4

1 回答 1

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
于 2013-05-15T07:18:30.150 回答