Django — теги блокировки во включенных шаблонах переопределяются путем вызова шаблона

У меня есть шаблон, который включает в себя другой шаблон. В этом включенном шаблоне есть блочные теги.

Пример:

base.html

BASE
{% block title %}Base Title{% endblock %}
{% block content %}{% endblock %}

template1.html

{% extends 'base.html' %}
{% block title %}Extended Title{% endblock %}
{% block content %}
   Extended content
   {% include 'include.html' %}
{% endblock %}

include.html

{% block title %}Include Title{% endblock %}
{% block another_content %}Include Content{% endblock %}

Я ожидаю, что если я отрисую template.html, я должен получить, что я делаю в версии 1.1.1.

BASE
Extended Title
Extended content
Include Title
Include Content

Но на самом деле я получаю это, когда переключаюсь на 1.2.1 и 1.2.3:

BASE
Extended Title
Extended Content
Extended Title
Include Content

Как видите, основная надпись в include.html заменяется основной надписью template1.html. Эта замена происходит только в том случае, если имена блоков совпадают, поэтому, если я изменю основную надпись в include.html, этого не произойдет. Мне кажется, что это включает и расширяет одновременно? Кто-нибудь знает, ожидается ли это/я делаю что-то не так?


person Allan    schedule 26.09.2010    source источник


Ответы (2)


Если вы не используете extends в include.html, то это нормально — я полагаю, что в версии 1.1.1 была ошибка.

Выдержка из официальной документации:

Наконец, обратите внимание, что вы не можете определить несколько тегов {% block %} с одинаковыми именами в одном и том же шаблоне. Это ограничение существует из-за того, что тег блока работает в обоих направлениях. То есть блочный тег не просто заполняет дыру — он также определяет содержимое, которое заполняет дыру в родительском элементе. Если бы в шаблоне было два тега {% block %} с одинаковыми именами, родитель этого шаблона не знал бы, какой из блоков использовать.

Прочитайте все здесь: Наследование шаблонов

person bx2    schedule 26.09.2010

Если это то, что вы хотите, то include.html вообще не должен содержать никаких блоков, т.е. просто:

Include Title
Include Content
person SingleNegationElimination    schedule 28.09.2010
comment
Примерно то, о чем я говорил выше :) - person bx2; 28.09.2010