【发布时间】: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 之间没有区别,因此无法查看您的用例。