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.htmlobject-details.html.
  • 然后通过扩展这些模板来构建您的最终模板。喜欢 book-section.htmlauthor-details.htmlbook-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 关注如何呈现一本书,给定一个地方放置内容和另一个地方放置元数据。