我在settings.INSTALLED_APPS中有两个应用程序:
INSTALLED_APPS = [
'application2',
'application1'
]
并希望application2从application1更改模板(例如,通过添加按钮)。
如何在不覆盖整个模板的情况下实现这一目标?
注意
问题是这两个模板具有相同的名称(“mytemplate.html”)和相同的文件夹名称(“application1”):
\project_root
\application1\templates\application1\mytemplate.html
\application2\templates\application1\mytemplate.html
所以我不能写:
{% extends "application1\mytemplate.html" %}
因为这两个模板都命名为“application1 \ mytemplate.html”。
答案 0 :(得分:2)
我不认为这对您描述的情况是可行的,因为它暗示INSTALLED_APPS顺序很重要。因为它是stated in the django book:
INSTALLED_APPS的顺序无关紧要,但我们希望保持字母顺序,以便人们可以轻松阅读。
据我所知,这不是官方文档。然而,这本书是由Adrian Holovaty和Jacob Kaplan-Moss(Django创作者)撰写的,所以我会接受他们的话。
但如果你仔细想一想,你会明白为什么订购不是一个好主意: 它只对特定情况有帮助 - 容易的情况。在稍微复杂的情况下,它无济于事。 E.g:
app1
,app2
,app3
。app2
和app3
扩展/覆盖模板app1/a.html
和app1/b.html
。a.html
中定义的app2
和b.html
中定义的app3
。 答案 1 :(得分:1)
我不认为这是可能的,除非你有不同的模板名称,那么你可以使用{{block.super}}
一旦加载程序找到正确的文件,它就不会再查看了,因此您无权访问新模板中的被覆盖模板。
https://code.djangoproject.com/browser/django/trunk/django/template/loaders/app_directories.py#L57
答案 2 :(得分:1)
模板并非真正归应用程序所有。如果您愿意,可以将它们分组到应用程序目录中,但几乎与它们无关。
覆盖模板的一部分的方式,无论应用程序提供什么,都是使用{% extends 'template_name.html' %}
从它继承,然后定义你需要覆盖的任何块。当然,这意味着父模板需要已经定义了这些块 - 否则你需要覆盖定义的最小相关块,并重复需要更改的位周围的一些内容。