Переопределить внутренний блок шаблона в Django - PullRequest
3 голосов
/ 23 марта 2011

У меня есть следующая структура шаблонов (упрощенная для ясности):

base1.html :

<html>
    <head>{% block head %}{% endblock %}</head>
    <body>{% block body %}{% endblock %}</body>
</html>

base2.html :

{% extends "base1.html" %}
{% block head %}
    <meta .... />
    <title .... />
    css includes etc.
{% endblock %}
{% block body %}
    {% block header %}{% endblock %}
    {% block featured %}{% endblock %}
    {% block navigation %}{% endblock %}
    {% block content %}{% endblock %}
    {% block footer %}{% endblock %}
{% endblock %}

Также base3.html и base4.html , которые дополнительно детализируют общую структуру тела, определенную в предыдущих базовых шаблонах (здесь не показано).Последний шаблон расширяет base4.html , переопределяя блоки с конкретным содержимым (разметка обрабатывается базовыми шаблонами).

Вопрос: у меня есть два шаблона: main.html и article.html , которые оба расширяют base4.html .Но в article.html я хочу, чтобы порядок блоков тела, определенных в base2.html , был другим ( Featured block, чтобы идти после navigation ).Как я могу этого достичь?Или как изменить структуру шаблонов, чтобы сделать это возможным?Переопределение блока body в шаблоне верхнего уровня не работает.

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Я не думаю, что вам повезет, если вы так поступите.Простым решением может быть наличие необязательной переменной, которую просматривает base2.html, которая определяет альтернативный порядок.На самом деле может даже оказаться, что вы можете определить наличие этой переменной в самом шаблоне article.html.Я не пробовал это, но может работать что-то вроде следующего:

{% with alternate_order=1 %}
    {% include base4.html
{% endwith %}
1 голос
/ 23 марта 2011

Почему у вас так много уровней наследования?Как примечание, django не предоставляет никаких ограничений, но обычно мы используем трехуровневый подход.См. документы

Вот несколько предложений:

  • Возможно, вы можете объединить base1.html и base2.html.
  • Если можетепоместите HTML-код в родительский, а затем сделайте это.Я обычно реализую свои шаблоны следующим образом:
    • <div id='sidebar'>{% block sidebar_content %}{% endblock %}</div>

Что касается вашей проблемы, если вам нужен другой макет, тогда вы переходите.То есть, если использование другого CSS не будет работать.

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