2

我正在使用 Django 1.1,并且我有这个模板,一个基本模板,所有其他页面都继承自该模板。它定义了一堆几乎贯穿整个网站的东西,比如这个导航栏:

        <div id="navbar">
        {% block navbar %}
            <a href="">Link 1</a>
            <a href="">Link 2</a>
            <a href="">Link 3</a>
            <a href="">Link 4</a>
            <a href="/admin/">Admin</a>
        {% endblock %}
    </div>

但是 Django 在子模板中的默认行为是让子模板完全覆盖父模板中的块。我在这里有这个页面,不一定要覆盖导航栏块,只需向其中添加一些特定于该页面的条目,但现在我能看到这种情况发生的唯一方法是如果我是从父级复制导航栏块,然后将其包含在模板+我的添加中。有没有其他方法可以做到?

4

4 回答 4

7

在子模板中使用{{ block.super }}以包含父块中的内容。

于 2009-12-06T10:47:45.377 回答
2

正如 Alasdair 所指出的,{{ block.super }}允许您使用来自父级的值。

然而,如果你发现你总是需要这样做,你应该考虑你的块是否足够细化。您应该能够以这样一种方式布置它们,即每个块只定义它需要的内容。

于 2009-12-06T11:28:04.793 回答
2

您可以定义嵌套块,因此您也可以执行以下操作:

    <div id="navbar">
            {% block navbar %}
                    <a href="">Link 1</a>
                    <a href="">Link 2</a>
                    <a href="">Link 3</a>
                    <a href="">Link 4</a>
                    <a href="/admin/">Admin</a>
                    {% block navbar-extra %}{% endblock %}
            {% endblock %}
    </div>

需要覆盖整个导航栏的模板可以这样做,而其他模板可以只覆盖“navbar-extra”块。IMO 这比在您事先知道需要可扩展性的情况下使用 {{ block.super }} 更干净一些;YMMV。

于 2009-12-06T17:39:50.817 回答
0

您不必定义所有块,因此如果您不在子页面中定义导航栏块,它将使用来自父页面的块内容。

于 2009-12-06T10:42:47.850 回答