2009-12-06 7 views
2

Я использую Django 1.1, и у меня есть этот шаблон, базовый шаблон, который наследует все остальные страницы. Она определяет кучу вещей, которые постоянны на протяжении почти всего сайта, как эта навигационная панель:Наследование шаблонов в Django

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

Но поведение по умолчанию Джанго в дочерних шаблонах, чтобы ребенок полностью перекроют блоки в родительском шаблоне. У меня есть эта страница здесь, которая необязательно должна перекрывать блок navbar, просто добавьте еще несколько записей в нее, которые будут специфичны для этой страницы, но сейчас единственный способ увидеть, что это происходит, если я должны были скопировать блок navbar из родителя, а затем включить его в шаблон + мои добавления. Есть ли другой способ, который можно сделать?

ответ

7

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

0

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

2

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

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

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 мог сделать это, в то время как другие шаблоны могли бы просто переопределить «NavBar-экстра» блок. IMO это немного чище, чем использование {{block.super}} в ситуациях, когда вы заранее знаете, где вам понадобится расширяемость; YMMV.

Смежные вопросы