Django阻止包含不起作用。我错过了什么?

时间:2015-06-22 04:50:39

标签: django django-templates

在我的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

1 个答案:

答案 0 :(得分:2)

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),主列包含标题和描述,而旁边列包含最后更新的部分。

重点是允许重复使用和分离关注点。 base.html关注文档的结构。 base_2cols.html关注如何使用菜单创建2列视图。 book.html关注如何呈现一本书,给出了放置内容的位置和另一个放置元数据的位置。