Наследование шаблонов в Django - PullRequest
2 голосов
/ 06 декабря 2009

Я использую 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 ]

7 голосов
/ 06 декабря 2009

Используйте {{ block.super }} в дочернем шаблоне, чтобы включить содержимое из родительского блока.

2 голосов
/ 06 декабря 2009

Вы можете определить вложенные блоки, чтобы вы могли сделать что-то вроде этого:

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

2 голосов
/ 06 декабря 2009

Как отметил Alasdair, {{ block.super }} позволяет использовать значение из родительского элемента.

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

0 голосов
/ 06 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...