Django 块包含不起作用。我错过了什么?
Django block inclusion not working. What did I miss?
在我的 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
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),主列包含标题和描述,旁边的列包含最后更新的部分。
重点是允许 re-use 和关注点分离。 base.html
关注文档的结构。 base_2cols.html
关注如何创建带有菜单的 2 列视图。 book.html
关注如何呈现一本书,给定一个地方放置内容和另一个地方放置元数据。
在我的 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
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),主列包含标题和描述,旁边的列包含最后更新的部分。
重点是允许 re-use 和关注点分离。 base.html
关注文档的结构。 base_2cols.html
关注如何创建带有菜单的 2 列视图。 book.html
关注如何呈现一本书,给定一个地方放置内容和另一个地方放置元数据。