Недопустимый тег блока в строке 5: «else». Вы забыли зарегистрировать или загрузить этот тег? [Дубликат]

Однажды я столкнулся с той же проблемой, когда я не совсем привык к the life in the IoC world. Поле @Autowired одного из моих bean-компонентов является нулевым во время выполнения.

Основная причина заключается в том, что вместо использования автоматически созданного компонента, поддерживаемого контейнером Spring IoC (чье поле @Autowired равно indeed ] правильно введенный), я newing мой собственный экземпляр этого типа бобов и его использование. Конечно, это поле @Autowired равно нулю, потому что Spring не имеет возможности его ввести.

23
задан GregL83 18 February 2011 в 16:27
поделиться

4 ответа

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

{% extends my_template %}

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

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

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

22
ответ дан Klaus Byskov Pedersen 21 August 2018 в 23:18
поделиться
  • 1
    Я думал, что это единственный способ ... Чувствует, что ... – GregL83 18 February 2011 в 16:47
  • 2
    Это не единственный способ. – sleblanc 30 March 2015 в 18:12
  • 3
    Я не вижу template_values ​​в документации. Я также не уверен, куда поместить код template_values. Итак, я не знаю, как реализовать выбранный ответ. – Marjorie Roswell 21 April 2015 в 18:37

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

23
ответ дан Community 21 August 2018 в 23:18
поделиться
  • 1
    {% extends request.is_ajax | yesno .....%} отлично работает, и вам не нужны дополнительные переменные – Rafael 18 May 2014 в 14:57
  • 2
    Пока вы используете RequestContext вместо обычного Context. – sleblanc 20 May 2014 в 14:37

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

0
ответ дан Dave 21 August 2018 в 23:18
поделиться
  • 1
    Проблема в том, что {% 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() , поэтому вам не нужно ничего делать в своих контроллерах и шаблонах.

5
ответ дан Vladimir Prudnikov 21 August 2018 в 23:18
поделиться
  • 1
    да, это решение; однако, я считаю, что разделение задачи с помощью файла шаблона более чистое, чем обертывание всего в гигантском, если ... – GregL83 10 August 2011 в 16:46
  • 2
    это не очень хорошее решение ... лучше поставить не ajax в layout.html и расширить его – David 天宇 Wong 18 February 2014 в 01:44
  • 3
    @ GregL83 Гораздо проще иметь ОДИН, если оператор в одном шаблоне намного проще записывать оператор if, который будет определять имя базового шаблона в контроллере EACH. Также ajax можно определить с помощью контекстного процессора из HttpRequest.is_ajax(). См. Обновленный ответ. – Vladimir Prudnikov 18 February 2014 в 10:17
  • 4
    @David 天宇 Wong, пожалуйста, возьмите добычу при обновленном ответе и моем предыдущем комментарии. – Vladimir Prudnikov 18 February 2014 в 10:18
Другие вопросы по тегам:

Похожие вопросы: