Django中的模板继承

Django中的模板继承,django,templates,template-inheritance,Django,Templates,Template Inheritance,我使用的是Django 1.1,我有一个模板,一个基本模板,所有其他页面都从中继承。它定义了一系列在几乎整个网站上都是恒定不变的东西,比如这个导航栏: <div id="navbar"> {% block navbar %} <a href="">Link 1</a> <a href="">Link 2</a> <a href=

我使用的是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>

{%block navbar%}
{%endblock%}

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

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

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

如阿拉斯代尔所述,
{block.super}}
允许您使用来自父级的值


但是,如果你发现你总是需要这样做,你应该考虑你的积木是否足够大。您应该能够以这样的方式对它们进行布局,即每个块只定义它所需的内容。

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

    <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>

{%block navbar%}
{%block导航栏额外%}{%endblock%}
{%endblock%}
需要覆盖整个导航栏的模板可以这样做,而其他模板可以覆盖“导航栏额外”块。在我看来,这比在事先知道需要扩展性的地方使用{{block.super}要干净一些;YMMV