Django:扩展被覆盖的模板



我的设置中有两个应用程序。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的创作者)撰写的,所以我会相信他们的话

但如果你仔细想想,你就会明白为什么订购不是一个好主意:它只在特定的简单情况下有帮助。在稍微复杂一点的情况下,这也无济于事。例如:

  • 您有app1app2app3
  • app2app3都扩展/覆盖模板app1/a.htmlapp1/b.html
  • 您希望使用app2中定义的a.htmlapp3中定义的b.html

我认为这是不可能的,除非你有不同的模板名称,否则你可以使用{{block.super}}

一旦加载程序找到了正确的文件,它就不会再看下去了,所以您无法访问新模板中被覆盖的模板。

https://code.djangoproject.com/browser/django/trunk/django/template/loaders/app_directories.py#L57

模板并不是应用程序真正拥有的。如果您愿意,可以将它们分组到应用程序目录中,但它们基本上是独立的。

覆盖模板的一部分(无论应用程序提供了什么)的方法是使用{% extends 'template_name.html' %}从中继承,然后定义需要覆盖的任何块。当然,这意味着父模板需要已经定义了这些块,否则您需要覆盖已定义的最小相关块,并围绕需要更改的部分重复一些内容。

相关内容

  • 没有找到相关文章

最新更新