在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)
" ---除非这是唯一可能的解决方案(或仅推荐的解决方案)。
答案 0 :(得分:1)
你不能使用Jinja2表达式中的|
来操作Jinja2过滤器操作以外的任何东西。
使用{%%}
或{{}}
(等等)的每个语句都不是python。这是一个Jinja语言,lexed,由Jinja解析并执行。您放置的每一段代码都不会像您那样被“摧毁”,但即使是+
也会在Jinja2(github-Jinja2/parser.py#L450)的解析器模块中进行解析和执行。因此|
是Jinja语法的标记,不能颠倒其python意义。
您可以调用方法的原因是因为您的对象仍然是真实的,并且它们保留了所有功能。您建议使用.union
的解决方案是您唯一可用的解决方案。
仅供参考:Jinja2中没有开放(或已关闭)的问题以允许这样的可能性(如果我认为这样做可能会被拒绝)