Перезапись блока в шаблоне `include`d из расширенного шаблона - PullRequest
13 голосов
/ 27 января 2012

У меня есть следующее:

base.html

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>

header.html

<header>
     {% block logo %}Logo 1{% endblock %}
</header>

homepage.html

{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}

По сути, это не работает.Когда я рендерим homepage.html, я получаю:

<html>
    <header>Logo 1</header>
    <div>Yap Yap Yap</div>
</html>

, но если переместить код из header.html в base.html (т.е. избавиться от include в целом), все будет работать нормально.Кто-нибудь может объяснить, почему это так?

У меня такое ощущение, что это как-то связано с included шаблонами, полученными после того, как их родители были обработаны?

Ответы [ 4 ]

10 голосов
/ 27 января 2012

из документов

Тег включения следует рассматривать как реализацию «рендеринга этого подшаблона и включения HTML», а не как «разбора этого подшаблона и включения его содержимого, как если бы он был частью родительского элемента». Это означает, что между включенными шаблонами нет общего состояния - каждое включение является полностью независимым процессом рендеринга.

поэтому подшаблон (header.html) полностью отображается и вставляется в родительский шаблон (base.html), что означает, что отсутствует концепция блока для дочернего шаблона (homepage.html) для перезаписи

5 голосов
/ 27 февраля 2012

Это известное ограничение, которое, как мы надеемся, будет устранено в ближайшем будущем.

Кстати, если предположить, что у вас есть более сложная проблема, о которой вы упоминали, другой способ обойти это - сделать заголовоки затем переопределить этот блок с помощью нового пользовательского включения.

base.html

<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>

header.html

<header>
     {% block logo %}Logo 1{% endblock %}
</header>

homepage.html

{% extends 'base.html' %}

{% block header %}
    {% include 'homepage_header.html' %}
{% endblock %}

{% block content %}Yap Yap Yap{% endblock %}

homepage_header.html

{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}
2 голосов
/ 09 июля 2017

У меня была похожая проблема. У меня есть шаблон таблицы с фильтром, который имеет форму

{% extends 'base.html' %}
{% include 'filtered_table.html' %}

где Filter_table.html:

{% load render_table from django_tables2 %}
<div class="panel-body" >
  <form method='GET'>
  <div class="search-form" style="border: 1px solid #000000; background-color:#a3ffaf; overflow: auto;">
{% block render_form %}
    {% for field in filter.form %}
         {{ field.errors }}
         {{ field.label_tag }} {{ field }}
    {% endfor %}
{% endblock %}
    <input type='submit' value='Filter' />
    |
    Displaying {{ filter.qs.count }} of {{ filter.queryset.count }} {{ object_name }}s.
    |
    <a href='{{ request.path }}' >Clear</a> <p>
  </div>

{% if table %}
    {% render_table table %}
{% endif %}

</form>

</div>

Я могу захотеть специально изготовить форму вручную, например, написав каждое поле следующим образом:

{% block render_form %}
{{ filter.form.field1.errors }}
{{ filter.form.field1.label_tag }}
{{ filter.form.field1 }}
<p>

{{ filter.form.field2.errors }}
{{ filter.form.field2.label_tag }}
{{ filter.form.field2 }} 
{% endblock %}

К сожалению, из-за того, что я не могу дважды «расширить», я не могу получить базовый макет и настроить отфильтрованную таблицу. Таким образом, уродливый (потому что разбивает структуру HTML пополам) способ сделать это - просто определить begin_filtered_table.html и end_filtered_table.html . Затем в настраиваемом случае у меня есть два включения обертывания настройки, а для ненастроенного случая Filter_form.html определяется следующим образом:

{% include "begin_filtered_table.html" %}

    {% for field in filter.form %}
         {{ field.errors }}
         {{ field.label_tag }} {{ field }}
    {% endfor %}

{% include "end_filtered_table.html" %}

Это решает проблему за счет грубости. Было бы намного проще просто разрешить множественные расширения.

0 голосов
/ 27 января 2012

Вы не можете перезаписать логотип из homepage.html , поскольку он не определен в самом базовом шаблоне.

Решение, как вы предлагаете, состоит в том, чтобы переместить header.html код в base.html

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