Django - блокировка тегов во включенных шаблонах переопределяется путем вызова шаблона - PullRequest
2 голосов
/ 26 сентября 2010

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

Пример:

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, этого не произойдет. Мне кажется, что это включает и расширяет одновременно? Кто-нибудь знает, ожидается ли это / я делаю что-то не так?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2010

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

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

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

Читать все здесь: Наследование шаблонов

0 голосов
/ 28 сентября 2010

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

Include Title
Include Content
...