Шаблоны Django: переопределение блоков включенных дочерних шаблонов через расширенный шаблон

Мне интересно, знает ли кто-нибудь, как справиться со следующей причудливой структурой шаблона:

### base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">

<head>
  <title> {% block title %} Title of the page {% endblock %} </title>
</head>

<body>
  <header>
    {% block header %}
      {% include "base/header.html" %}
    {% endblock header %}
  </header>
  {% block content %}{% endblock %}
</body>

</html>

### base/header.html
<div id="menu-bar">
  {% block nav %}
    {% include "base/nav.html" %}
  {% endblock %}
</div>

### base/nav.html
<nav id="menu">
  <ul>
    <li>
      <a href="/profile/">My Profile</a>
    </li>
    <li>
      <a href="/favs/">My Favorites</a>
    </li>
    {% block extra-content %}{% endblock %}
  </ul>
</nav>

И, суть вопроса:


### app/somepage.html
{% extends "base.html" %}
{% block content %}
  <p>Content is overridden!</p>
{% endblock %}

{% block extra-content %}
  <p>This will not show up, though...</p>
{% endblock %}

{% block nav %}
  <p>Not even this.</p>
{% endblock %}

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

Полагаю, я мог бы сделать base.html оболочкой из пустых неиспользуемых вложенных блоков, покрывающих все будущие непредвиденные обстоятельства, но будет ли даже это правильно переопределять? И это единственный способ?

Если вам интересно, почему у меня двунаправленный рабочий процесс include/extends вокруг base.html, у меня есть много подшаблонов, которые я хочу использовать во всем проекте: заголовки, нижние колонтитулы, навигация, боковые панели и т. д. Все они будут одинаковыми по структуре на всем сайте, но во многих случаях сайту потребуется только несколько из этих подшаблонов. Моя идея заключалась в том, чтобы определить подшаблоны в папке templates/base и иметь templates/base-type1.html, templates/base-type2.html и т. д. для расширения в других местах. Каждый тип будет ссылаться только на необходимые подшаблоны и переопределять их для размещения контента по мере необходимости.

33
задан Chris Keele 3 April 2012 в 15:23
поделиться