Django:扩展被覆盖的模板

时间:2012-02-08 10:03:05

标签: python django django-templates modularity django-apps

我在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”。

3 个答案:

答案 0 :(得分:2)

我不认为这对您描述的情况是可行的,因为它暗示INSTALLED_APPS顺序很重要。因为它是stated in the django book

  

INSTALLED_APPS的顺序无关紧要,但我们希望保持字母顺序,以便人们可以轻松阅读。

据我所知,这不是官方文档。然而,这本书是由Adrian Holovaty和Jacob Kaplan-Moss(Django创作者)撰写的,所以我会接受他们的话。

但如果你仔细想一想,你会明白为什么订购不是一个好主意: 它只对特定情况有帮助 - 容易的情况。在稍微复杂的情况下,它无济于事。 E.g:

  • 您有app1app2app3
  • app2app3扩展/覆盖模板app1/a.htmlapp1/b.html
  • 您希望使用a.html中定义的app2b.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' %}从它继承,然后定义你需要覆盖的任何块。当然,这意味着父模板需要已经定义了这些块 - 否则你需要覆盖定义的最小相关块,并重复需要更改的位周围的一些内容。