在我的base.html
文件中,我有这个:
{% block menu %}{% endblock menu %}
在base_menu.html
我有这个:
{% extends "base.html" %}
{% block menu %}
<nav class="navbar navbar-inverse navbar-fixed-top">
... stuff ...
</div>
{% endblock menu %}
我希望菜单html显示初始block menu
指令的位置......但不包括。我错过了什么?
应该很容易! :d
答案 0 :(得分:2)
Django模板不像template inheritance那样使用包含。
这个想法是你设置一个模板层次结构,专门研究一些常见的东西。例如:
base.html
,这对您网站的所有页面都是通用的。section.html
,object-details.html
。book-section.html
,author-details.html
,book-details.html
。关键是,在您的视图中,您包含继承树的叶子。它们只定义了在继承树中定义得更高的占位符(块)的详细信息。
示例:
<强> base.html文件强>
<html>
<head>
<title>{{ title }}</title>
{% block css %}<link rel="stylesheet" href="main.css">{% endblock %}
</head>
<body class="{% block bodyclass %}{% endblock %}">
<header>{# TODO: put some logo and banner here #}</header>
{% block body %}
</body>
</html>
<强> base_2cols.html 强>
{% extends "base.html" %}
{% block bodyclass %}{{ block.super }} two-columns{% endblock %}
{% block body %}
<nav><ul>{% block menu %}</ul></nav>
<div id="wrapper"><main>{% block content %}{% endblock %}</main></div>
<aside>{% block metadata %}{% endblock %}</aside>
{% endblock %}
<强> book.html 强>
{% extends "base_2cols.html" %}
{% block bodyclass %}{{ block.super }} book{% endblock %}
{% block menu %}
<li>Some menu item</li>
<li>Some other menu item</li>
{% endblock menu %}
{% block content %}
<article>
<h1>{{ book.title }}</h1>
<p>{{ book.description }}</p>
</article>
{% endblock %}
{% block metadata %}
Last updated on {{ book.updated|date:"Y-m-d" }}
{% endblock %}
在您看来,您使用book.html
。它将呈现一个包含两列的整页(当然,给定正确的css),主列包含标题和描述,而旁边列包含最后更新的部分。
重点是允许重复使用和分离关注点。 base.html
关注文档的结构。 base_2cols.html
关注如何使用菜单创建2列视图。 book.html
关注如何呈现一本书,给出了放置内容的位置和另一个放置元数据的位置。