Вызов блока внутри условия if: шаблон django
Я пытаюсь вызвать блок внутри условия if в шаблоне django.
У меня есть base template
. У меня есть много других шаблонов, которые расширяют базовый шаблон.
Я определил блок в базовом шаблоне:
{% block test_block %}Test{% endblock %}
Затем я хочу переопределить этот блок при определенном условии в других шаблонах. Если условие не выполняется, блок не должен переопределяться. Это то, что я написал:
{% if test_value %}{% block test_block %}Development{% endblock %}{% endif %}
Это фактически (или может быть практически) игнорирует условие if.
Что я наконец сделал:
{% block test_block %}{% if test_value %}Development{% else %}{{ block.super }}{% endif %}{% endblock %}
Мне нужно было сделать что-то подобное во всем, что требовалось.
Это лучший способ? Это единственный способ? Почему я не могу попробовать первый способ? Или есть какая-то ошибка с моей стороны?
Ответы
Ответ 1
Вы не ошиблись - блоки шаблонов включены независимо от каких-либо условий вокруг них. Вы можете увидеть это из этой строки класса ExtendsNode
в django/template/loader_tags.py
в исходном коде Django:
self.blocks = {n.name: n for n in nodelist.get_nodes_by_type(BlockNode)]}
Когда рендерится {% extends %}
, он извлекает все узлы блока из шаблона напрямую и сохраняет их для рендеринга, когда родительский объект сталкивается с этими block
. Были ли эти блоки у ребенка внутри условных или нет, не рассматривается.