Jinja2逃避过滤器运算符(“|”)

时间:2014-11-10 20:55:31

标签: python jinja2

在jinja2中,运算符|用作过滤,例如{{ user_input | safe }}。但是,|也是一个有效的python运算符,比如bitwise-or,set union等。假设我在模板中有以下代码

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

Jinja抛出异常

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不要将|运算符解释为过滤器?我希望有一个比#34更好的解决方案;将(set1 | set2)替换为set1.union(set2)" ---除非这是唯一可能的解决方案(或仅推荐的解决方案)。

1 个答案:

答案 0 :(得分:1)

你不能使用Jinja2表达式中的|来操作Jinja2过滤器操作以外的任何东西。 使用{%%}{{}}(等等)的每个语句都不是python。这是一个Jinja语言,lexed,由Jinja解析并执行。您放置的每一段代码都不会像您那样被“摧毁”,但即使是+也会在Jinja2(github-Jinja2/parser.py#L450)的解析器模块中进行解析和执行。因此|是Jinja语法的标记,不能颠倒其python意义。

您可以调用方法的原因是因为您的对象仍然是真实的,并且它们保留了所有功能。您建议使用.union的解决方案是您唯一可用的解决方案。

仅供参考:Jinja2中没有开放(或已关闭)的问题以允许这样的可能性(如果我认为这样做可能会被拒绝)