Django中的模板继承

时间:2009-12-06 10:28:53

标签: django templates template-inheritance

我正在使用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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

正如Alasdair所说,{{ block.super }}允许您使用父母的值。

但是,如果您发现总是需要这样做,那么您应该考虑您的块是否足够精细。您应该能够以每个块仅定义所需内容的方式进行布局。

答案 2 :(得分: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。

答案 3 :(得分:0)

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