我想知道是否有人知道如何处理以下古怪的模板结构:
### 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文件夹下定义子模板,并在其他地方扩展模板/ base-type1.html,templates / base-type2.html等。每种类型只会引用所需的子模板,并覆盖它们以根据需要放置内容。
答案 0 :(得分:30)
似乎鲜为人知的是,您可以将with
关键字与include
一起用于将变量传递到包含模板的上下文中 - 您可以使用它在包含的模板中指定包含:
# base.html
<html>
<body>
{% block header %}{% include "header.html" %}{% endblock %}
</body>
</html>
# header.html
# some stuff here
<div id="header">
<img src="logo.png">
{% include nav_tmpl|default:"navigation.html" %}
</div>
# special_page.html (uses other navigation)
{% extends "base.html" %}
{% block header %}
{% include "header.html" with nav_tmpl="special_nav.html" %}
# you might also want to wrap the include in an 'if' tag if you don't want anything
# included here per default
{% endblock %}
这种方法至少可以节省一个额外的文件,只是为了覆盖一个块。您还可以使用with
关键字通过更大的包含层次结构传递值。
答案 1 :(得分:11)
solution proposed by @Bernhard Vallant的一个简单变体:
# base.html
<html>
<body>
{% block header %}{% include "header.html" %}{% endblock %}
</body>
</html>
# header.html
# some stuff here
<div id="header">
<img src="logo.png">
{% include nav_tmpl|default:"navigation.html" %}
</div>
# special_page.html (uses other navigation)
{% extends "base.html" %}
{% block header %}
{% with nav_tmpl="special_nav.html" %}
{{ block.super }}
{% endwith %}
{% endblock %}
答案 2 :(得分:6)
您可以通过扩展当前包含的模板,然后包含扩展名而不是当前包含的基本模板来解决此问题。