Наследование шаблонов в 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 на дочерней странице, он будет использовать содержимое блока из родительского.