我们如何在 Django 中编写扩展多个父模板的子模板?

Posted

技术标签:

【中文标题】我们如何在 Django 中编写扩展多个父模板的子模板?【英文标题】:How do we write child templates that extends more than one parent template in Django? 【发布时间】:2018-06-23 13:18:25 【问题描述】:

我一直在通过 Udemy 课程学习 Django,并通过了模板继承。据我了解,它的工作原理如下:

模板/myapp/parent.html

<div class="container">
  % block child_block %
    # delegated to child template #
  % endblock %
</div>

模板/myapp/child.html

<!DOCTYPE html>
% extends "myapp/parent.html" %
% block child_block %
  <!-- child content -->
% endblock %

我们有一个父模板parent.html 和一个子模板child.html。父模板声明了一个块,它将委托给子模板。子模板声明它扩展的父模板,然后声明与其包含的内容相同的块。在页面构建过程中,Django 将构建父模板,到达块,并用子模板声明的内容填充它 --- 规定您不要在任何给定模板中使用具有相同名称的块(以防止名称冲突)。

此模式非常适用于父模板可能有多个子模板和/或多个嵌套子模板的用例。您可以更有效地组织模板代码,并以更小更易于管理的块。如果要重复 N 次子项(通常通过 for 循环),则在 for 循环中委派一个块以确保每次迭代都使用相同的模板 (DRY)。

相反的情况呢?

对于多个父级重复使用公共子模板的用例,我们该怎么做?在 Django 的说法中,子模板扩展多个父模板的用例呢? 例如,假设我们有一个包含多个页面的应用程序,该应用程序重用了一些常见的视图代码(可能是他们都使用的模型)。 DRY 原则告诉我,最好将通用视图代码抽象为通用模板——Django 中的子模板。不过这会带来一个问题,因为 Django 的子模板必须在其 extends 模板标签中声明其父模板

这是一个例子:

模板/myapp/parent_1.html

<div class="container">
  % block child_block %
    # delegated to child template #
  % endblock %
</div>

模板/myapp/parent_2.html

<div class="container">
  % block child_block %
    # delegated to child template #
  % endblock %
</div>

模板/myapp/child.html

<!DOCTYPE html>
% extends "myapp/parent_?.html" % # extend which parent ??? #
% block child_block %
  <!-- child content -->
% endblock %

那么我们如何编写扩展多个父模板的子模板?

研究

仔细阅读 SO 和一些 Django 文档,我看到了almost similar 的问题;但是,他们始终提到在在同一页面中恢复模板块。常见的答案似乎是使用包含语句或使用不同的块名称并覆盖子模板中的内容。然而,这个问题涉及跨多个页面重用模板块(因此有多个父模板)。

【问题讨论】:

我不明白你在问什么。孩子是父母的延伸,而不是相反。而且由于您的示例在 parent_1 和 parent_2 之间没有区别,因此无法查看您的用例。 【参考方案1】:

我认为你做不到。

最好的方法是使用一个父级,然后使用% include 'your_file.html' %

您可以定义一个祖父母,然后继承它并创建多个父母,然后相应地再次为孩子继承它。

【讨论】:

这是正确答案,你在父级中使用% include % @KareemElashmawy,如果此答案对您有所帮助,请投票并选择答案。感谢大家的配合

以上是关于我们如何在 Django 中编写扩展多个父模板的子模板?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 django 的单个 html 模板中扩展多个 html 吗?如果可以,那么如何?

Django从父对象访问模板中的子数据

Django DRY - 如何在 Django 模板中扩展两个 .html 文件?

扩展在 Django 1.9 中不起作用

在奏鸣曲管理员中,我们如何拥有多个级别的子管理员

Django 模板:通过扩展模板覆盖包含的子模板块