Однажды я столкнулся с той же проблемой, когда я не совсем привык к the life in the IoC world
. Поле @Autowired
одного из моих bean-компонентов является нулевым во время выполнения.
Основная причина заключается в том, что вместо использования автоматически созданного компонента, поддерживаемого контейнером Spring IoC (чье поле @Autowired
равно indeed
] правильно введенный), я newing
мой собственный экземпляр этого типа бобов и его использование. Конечно, это поле @Autowired
равно нулю, потому что Spring не имеет возможности его ввести.
Вы не можете так сделать. Однако вы можете установить переменную и использовать ее для выбора расширяемого шаблона:
{% 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
, или, альтернативно, если вы вставляете объект запроса в контекст вашего шаблона.
Если вы не хотите «расширять» родительский шаблон, вы всегда можете создать пустой файл с именем null.html и расширить его. Вид взломанный, но понятный.
{% extends "/base.html" %}
должна быть первой строкой, вы не можете добавить if statement.
– Vladimir Prudnikov
22 July 2011 в 12:10
Я искал решение той же проблемы и пришел с немного лучше обходным решением, чем предлагалось 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
.
UPDATE: Это можно упростить, создав и добавив новый ConextProcessor, который будет заполнять контекстную переменную ajax
из HttpRequest.is_ajax()
, поэтому вам не нужно ничего делать в своих контроллерах и шаблонах.
if
, который будет определять имя базового шаблона в контроллере EACH. Также ajax
можно определить с помощью контекстного процессора из HttpRequest.is_ajax()
. См. Обновленный ответ.
– Vladimir Prudnikov
18 February 2014 в 10:17