Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:扩展覆盖的模板_Python_Django_Django Templates_Modularity_Django Apps - Fatal编程技术网

Python Django:扩展覆盖的模板

Python Django:扩展覆盖的模板,python,django,django-templates,modularity,django-apps,Python,Django,Django Templates,Modularity,Django Apps,我的设置中有两个应用程序。已安装的应用程序: INSTALLED_APPS = [ 'application2', 'application1' ] 并希望application2从application1更改模板(例如,通过添加按钮) 如何在不覆盖整个模板的情况下实现这一点 注意 问题是这两个模板具有相同的名称(“mytemplate.html”)和相同的文件夹名称(“application1”): 所以我不能写: {% extends "application1\mytem

我的设置中有两个应用程序。已安装的应用程序:

INSTALLED_APPS = [
    'application2',
    'application1'
]
并希望application2从application1更改模板(例如,通过添加按钮)

如何在不覆盖整个模板的情况下实现这一点

注意


问题是这两个模板具有相同的名称(“mytemplate.html”)和相同的文件夹名称(“application1”):

所以我不能写:

{% extends "application1\mytemplate.html" %}

因为两个模板都命名为“application1\mytemplate.html”。

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

一旦加载器找到正确的文件,它就不会再进一步查看,所以您无法访问新模板中的重写模板


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


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

我认为这不可能适用于您描述的情况,因为这意味着安装的应用程序顺序很重要。事实上:

安装的应用程序的顺序并不重要,但我们喜欢按字母顺序排列,这样便于人们阅读

我知道这不是官方文件。然而,这本书是由阿德里安·霍洛瓦蒂和雅各布·卡普兰·莫斯(Django的创作者)写的,所以我会相信他们的话

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

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

问题在于两个模板的名称相同。我在问题上加了这张便条,所以他们的名字不一样吗?那无论如何都不行。Django将始终使用指定的名称提取它找到的第一个模板,因此将永远不会使用安装的应用程序中较低的应用程序的模板。有Django应用程序(例如Django grappelli:)将在其他应用程序之前插入安装的应用程序中,所以他们可以覆盖默认行为。我知道依赖已安装应用程序顺序的应用程序确实存在。但这绝对是无稽之谈。例如,django grappeli对django管理界面进行了重大修改。从功能的角度来看,django grappeli更像是django mod,而不是django应用程序。对于你的日常应用来说,依赖已安装的应用程序订单绝对不是一个好的Django实践。
{% extends "application1\mytemplate.html" %}