Наследование шаблонов в Django

Я использую 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 по умолчанию в дочерних шаблонах состоит в том, чтобы дочерние шаблоны полностью переопределяли блоки в родительском шаблоне. У меня есть эта страница, которая не обязательно должна переопределять блок navbar, просто добавьте к нему еще несколько записей, которые будут специфичны для этой страницы, но сейчас я вижу, как это происходит, только если я должны были скопировать блок navbar из родительского блока и затем включить его в шаблон + мои дополнения. Есть ли другой способ сделать это?

4 ответа

Решение

Использование {{ 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>

Шаблоны, которым нужно переопределить всю панель навигации, могут это сделать, в то время как другие шаблоны могут просто переопределить блок "navbar-extra". IMO, это немного чище, чем использовать {{ block.super }} в ситуациях, когда вы заранее знаете, где вам понадобится расширяемость; YMMV.

Вам не нужно определять все блоки, поэтому, если вы не определите блок navbar на дочерней странице, он будет использовать содержимое блока из родительского.

Другие вопросы по тегам