我的设置中有两个应用程序。INSTALLED_APPS:
INSTALLED_APPS = [
'application2',
'application1'
]
并且希望应用程序2从应用程序1更改模板(例如通过添加按钮)。
如何在不覆盖整个模板的情况下实现这一点?
注意
问题是这两个模板有相同的名称("mytemplate.html")和相同的文件夹名称("application1"):
project_root
application1templatesapplication1mytemplate.html
application2templatesapplication1mytemplate.html
所以我不能写:
{% extends "application1mytemplate.html" %}
因为这两个模板都命名为"application1\mytemplate.html".
我认为对于您描述的情况来说这是不可能的,因为这意味着INSTALLED_APPS顺序很重要。正如django书中所述:
INSTALLED_APPS的顺序无关紧要,但我们喜欢按字母顺序排列,这样人类就很容易阅读。
我知道这不是官方文件。然而,这本书是由Adrian Holovaty和Jacob Kaplan Moss(Django的创作者)撰写的,所以我会相信他们的话
但如果你仔细想想,你就会明白为什么订购不是一个好主意:它只在特定的简单情况下有帮助。在稍微复杂一点的情况下,这也无济于事。例如:
- 您有
app1
、app2
、app3
app2
和app3
都扩展/覆盖模板app1/a.html
和app1/b.html
- 您希望使用
app2
中定义的a.html
和app3
中定义的b.html
我认为这是不可能的,除非你有不同的模板名称,否则你可以使用{{block.super}}
一旦加载程序找到了正确的文件,它就不会再看下去了,所以您无法访问新模板中被覆盖的模板。
https://code.djangoproject.com/browser/django/trunk/django/template/loaders/app_directories.py#L57
模板并不是应用程序真正拥有的。如果您愿意,可以将它们分组到应用程序目录中,但它们基本上是独立的。
覆盖模板的一部分(无论应用程序提供了什么)的方法是使用{% extends 'template_name.html' %}
从中继承,然后定义需要覆盖的任何块。当然,这意味着父模板需要已经定义了这些块,否则您需要覆盖已定义的最小相关块,并围绕需要更改的部分重复一些内容。