Подтвердить что ты не робот

Python/Django - утверждение if в шаблоне вокруг расширений

Я хотел бы иметь шаблон, который расширяет другой условно. В принципе, когда переменная, называемая "ajax", истинна, я НЕ хочу, чтобы шаблон расширял другой.

{% if not ajax %}
    {% extends "/base.html" %}
{% endif %}

Любые подсказки?

4b9b3361

Ответ 1

Вы не можете так сделать. Однако вы можете установить переменную и использовать ее для выбора шаблона для расширения:

{% extends my_template %}

Затем в коде python вы пишете что-то вроде:

if ajax:
    template_values['my_template'] = 'base_ajax.html'
else:
    template_values['my_template'] = 'base.html'

Вы можете пожелать обратиться к документации за дополнительной информацией.

Ответ 2

Пока вы не можете вставлять extends в логические блоки, так как он должен быть первым тегом, если он используется, он все равно может принимать переменные, включая фильтры. Это должно соответствовать вашей цели:

{% extends ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}

Примечание. Фильтр yesno также принимает в качестве третьего выбора нулевые значения (None), и если вы не укажете его (как в этом случае), он будет возвращен к преобразованию его в False (т.е. он вернет второй выбор). Это позволяет не указывать переменную ajax в вашем шаблоне, не нарушая ее.


Предлагается пользователем Rafael:

{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}

Это будет работать, если вы используете контекст RequestContext вместо простого объекта Context, и у вас есть обработчик контекста request, или, альтернативно, если вы вставляете объект запроса в контекст вашего шаблона.

Ответ 3

Я искал решение той же проблемы и пришел с немного лучше обходным решением, чем предлагалось Klaus Byskov Hoffmann. Это лучше, потому что вы не должны иметь 2 отдельных базовых шаблонов для AJAX и не-Ajax запросов и, что более важно, вы не должны определить, если выражение, что будет определять, какой базовый шаблон для использования в каждом контроллере.

В вашем случае решение будет:

page.html

{% extends "/base.html" %}
{% block body %}
    hello world
{% endblock body %}

base.html

{% if not ajax %}
<html>
    <head></head>
    <body>
        LOGO and other stuff...

{% endif %}{% block body %}{% endblock body %}{% if not ajax %}

        FOOTER
    </body>
</html>
{% endif %}

Итак, base.html всегда включен, но он печатает его содержимое только тогда, когда not ajax.

UPDATE: Это может быть упрощена путем создания и добавления нового ConextProcessor, который будет заполнять ajax контекст переменной от HttpRequest.is_ajax(), так что вам не нужно делать ничего лишнего в контроллерах и шаблоны на всеp >

Ответ 4

Если вы не хотите "расширять" родительский шаблон, вы всегда можете создать пустой файл с именем null.html и расширить его. Вид взломанный, но понятный.