我想知道是否有人知道如何处理下面这种奇怪的模板结构:
### base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title> {% block title %} Title of the page {% endblock %} </title>
</head>
<body>
<header>
{% block header %}
{% include "base/header.html" %}
{% endblock header %}
</header>
{% block content %}{% endblock %}
</body>
</html>
### base/header.html
<div id="menu-bar">
{% block nav %}
{% include "base/nav.html" %}
{% endblock %}
</div>
### base/nav.html
<nav id="menu">
<ul>
<li>
<a href="/profile/">My Profile</a>
</li>
<li>
<a href="/favs/">My Favorites</a>
</li>
{% block extra-content %}{% endblock %}
</ul>
</nav>
而且,问题的关键在于:
### app/somepage.html
{% extends "base.html" %}
{% block content %}
<p>Content is overridden!</p>
{% endblock %}
{% block extra-content %}
<p>This will not show up, though...</p>
{% endblock %}
{% block nav %}
<p>Not even this.</p>
{% endblock %}
问题在于当扩展一个模板时,你只能覆盖父级中声明的块,而不能覆盖其任何子级。
我想我可以将base.html制作成未使用的空嵌套块的外壳,以涵盖所有未来的情况,但即使如此也能正常覆盖吗?这是唯一的方法吗?
如果你想知道为什么我在base.html周围有一个双向包含/扩展工作流程,那是因为我有许多子模板希望在整个项目中使用:头部、脚注、导航、侧边栏等。它们在整个站点中的结构都是一致的,但在许多情况下,整个站点的一个子分区只需要这些子模板中的几个。我的想法是在templates/base文件夹下定义子模板,并有templates/base-type1.html、templates/base-type2.html等来扩展其他地方。每种类型都只引用所需的子模板,并覆盖它们以根据需要放置内容。