Шаблон Django: почему блокирование включенного шаблона не может быть перезаписано дочерним шаблоном?

Чтобы более ясно проиллюстрировать мой вопрос, допустим, у меня есть шаблон include.html с контентом:

{% block test_block %}This is include{% endblock %}

У меня есть еще один шаблон с именем parent.html с контентом вроде этого:

This is parent

{% include "include.html" %}

Теперь я создаю шаблонное имя child.html, которое расширяет parent.html:

{% extends "parent.html" %}
{% block test_block %}This is child{% endblock %}

Моя идея заключается в том, что при рендеринге child.html test_block в child.html может перезаписать файл в include.html. По моему пониманию, когда шаблон включен, он включен как есть. Поэтому в моем случае я думаю, что parent.html равно:

This is parent

{% block test_block %}This is include{% endblock %}

Итак, child.html должен иметь возможность перезаписывать test_block. Но похоже, что это невозможно. Зачем? Есть ли способ обхода?

Ответ 1

Когда вы включаете шаблон, он отображает шаблон, а затем включает визуализированный контент.

Из django docs:

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

Обходным решением было бы обеспечить, чтобы дочерний шаблон расширил включенный шаблон вместо шаблона включения. Затем включите дочерний шаблон.