Django, переопределить блок шаблона условно - PullRequest
2 голосов
/ 05 января 2020
{% extends "Flow/base.html" %}

{% if no_tracking %}
    {% block head %}
        {% include "Flow/common/tracking/disabled.html" %}
    {% endblock %}
{% endif %}

Фрагмент приведенного выше кода переопределяет блок head в base.html, хотя no_tracking равен False. Как я могу сделать это поведение условным?

Я думал об этом:

{% block head %}
    {% if no_tracking %}
        {% include "Flow/common/tracking/disabled.html" %}
    {% else %}
    <!-- How can I get "head" of base.html here? -->
    {% endif %}

{% endblock %}

Но это также переопределило бы head из base.html.

head of base.html не пустой, он содержит сценарии, которые должны быть на странице, когда no_tracking имеет значение False.

Я мог бы переопределить их в base.html, но base.html не имеет понятия no_tracking, так как это переменная контекста, передаваемая отображаемому представлению, а не расширяемая.

Как я могу решить эту проблему?

1 Ответ

2 голосов
/ 05 января 2020

Вы можете использовать {{ block.super }} [Django -doc] для получения содержимого, отображаемого «родительским» блоком:

Если вам нужно получить содержимое блока из родительского шаблона, переменная {{ block.super }} сделает свое дело. Это полезно, если вы хотите добавить содержимое родительского блока вместо того, чтобы полностью его переопределить. Данные, вставленные с помощью {{ block.super }}, не будут автоматически экранированы (…), поскольку они уже были экранированы, если необходимо, в родительском шаблоне.

Так что здесь мы можем использовать его для добавления некоторого «дополнительного контента» к блоку:

{% block head %}
    {% if no_tracking %}
        {% include "Flow/common/tracking/disabled.html" %}
    {% endif %}
    <b>{{ block.super }}</b>
{% endblock %}
...