2014-11-10 4 views
3

В jinja2 в качестве фильтрации используется оператор |, такой как {{ user_input | safe }}. Однако | также действует оператор питона, скажем, побитовое или, установить соединение, и т.д. Предположим, у меня есть следующий код в шаблонеJinja2 убрать оператора фильтра («|»)

{% for elem in (set1 | set2) %} elem.render_some_string() {% endfor %} 

Дзиндзя бросает исключение

File "some_template_file.txt", line xxx, in template 
    {% for elem in (set1 | set2) %} elem.render_some_string() {% endfor %} 
jinja2.exceptions.TemplateAssertionError: no filter named 'set2' 

что понятно , Но есть ли способ обойти это, скажите, что jinja не интерпретирует оператор | как фильтр? Я надеюсь, что решение будет лучше, чем «заменить (set1 | set2) на set1.union(set2)» --- если это не единственное возможное решение (или только рекомендованное решение).

+0

Насколько мне известно, предлагаемое решение является путь , Но с удовольствием узнаем, есть ли способ переопределить ситуацию. –

ответ

1

Вы не можете использовать | в выражениях Jinja2 для управления чем-либо другим, кроме операции фильтра Jinja2. Каждое утверждение, использующее {%%} или {{}} (и так далее), на самом деле не является питоном. Это Jinja langage, lexed, разбирается с Jinja и казнен. Каждый фрагмент кода, который вы положили, не «обтекается», как вы могли бы, но даже анализ + анализируется и выполняется в модуле синтаксического анализа Jinja2 (github-Jinja2/parser.py#L450). Таким образом, | является символом грамматики Jinja и не может быть изменен на значение python.

Причина, по которой вы можете назвать свои методы, состоит в том, что ваши объекты по-прежнему являются настоящими, и они сохраняют все свои возможности. Решение, которое вы предлагаете использовать .union, является единственным доступным решением, которое у вас есть.

FYI: Там будет не открыт (или закрыт) вопрос в Jinja2 разрешить такую ​​возможность (и он может получить отказ, если сделал один, на мой взгляд)

Смежные вопросы