Python / Django - если оператор в шаблоне расширяется - PullRequest
23 голосов
/ 18 февраля 2011

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

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

Есть какие-нибудь подсказки?

Ответы [ 4 ]

23 голосов
/ 08 октября 2013

Хотя вы не можете обернуть 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, или, наоборот, если вы вставляете объект запроса в контекст вашего шаблона.

22 голосов
/ 18 февраля 2011

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

{% extends my_template %}

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

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

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

5 голосов
/ 22 июля 2011

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

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

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.

ОБНОВЛЕНИЕ: Это можно упростить, создав и добавив новый ConextProcessor, который будет заполнять переменную контекста ajax из HttpRequest.is_ajax(), так что вам вообще не нужно ничего делать в ваших контроллерах и шаблонах.

0 голосов
/ 05 апреля 2011

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

...