Я хотел бы иметь шаблон, который расширяет другой условно. В принципе, когда переменная, называемая "ajax", истинна, я НЕ хочу, чтобы шаблон расширял другой.
{% if not ajax %}
{% extends "/base.html" %}
{% endif %}
Любые подсказки?
Я хотел бы иметь шаблон, который расширяет другой условно. В принципе, когда переменная, называемая "ajax", истинна, я НЕ хочу, чтобы шаблон расширял другой.
{% if not ajax %}
{% extends "/base.html" %}
{% endif %}
Любые подсказки?
Вы не можете так сделать. Однако вы можете установить переменную и использовать ее для выбора шаблона для расширения:
{% extends my_template %}
Затем в коде python вы пишете что-то вроде:
if ajax:
template_values['my_template'] = 'base_ajax.html'
else:
template_values['my_template'] = 'base.html'
Вы можете пожелать обратиться к документации за дополнительной информацией.
Пока вы не можете вставлять 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
, или, альтернативно, если вы вставляете объект запроса в контекст вашего шаблона.
Я искал решение той же проблемы и пришел с немного лучше обходным решением, чем предлагалось 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 >
Если вы не хотите "расширять" родительский шаблон, вы всегда можете создать пустой файл с именем null.html и расширить его. Вид взломанный, но понятный.