4

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

4

3 回答 3

2

对于您描述的情况,我认为这是不可能的,因为这意味着 INSTALLED_APPS 顺序很重要。正如django 书中所述

INSTALLED_APPS 的顺序无关紧要,但我们喜欢按字母顺序排列,以便人类阅读。

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

但是,如果您稍微考虑一下,您就会明白为什么订购不是一个好主意:它只在特定的简单情况下有所帮助。在稍微复杂的情况下,它不会有帮助。例如:

  • 你有app1, app2, app3.
  • app2和扩展app3/覆盖模板app1/a.htmlapp1/b.html.
  • 您想a.html按照 中定义的app2b.html中定义的方式使用app3
于 2012-04-30T16:37:29.737 回答
1

模板并不真正属于应用程序。如果您愿意,可以将它们分组到应用程序目录中,但它们几乎独立于它们。

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

于 2012-02-08T10:32:36.010 回答
1

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

一旦加载器找到正确的文件,它就不会再查看了,因此您无法访问新模板中被覆盖的模板。

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

于 2012-02-08T10:22:44.710 回答