【发布时间】:2018-03-26 09:00:40
【问题描述】:
假设我有一个变量
t = [(1, 'hello'), (2, 'world')]
我想要的是在 Jinja 模板中将其映射到仅包含元组的第二个元素的新列表:
{% set s = t | map(...) | list %}
变量s 应该是['hello', 'world']。
如果不使用自定义过滤器,这是否可能以某种方式实现?
【问题讨论】:
假设我有一个变量
t = [(1, 'hello'), (2, 'world')]
我想要的是在 Jinja 模板中将其映射到仅包含元组的第二个元素的新列表:
{% set s = t | map(...) | list %}
变量s 应该是['hello', 'world']。
如果不使用自定义过滤器,这是否可能以某种方式实现?
【问题讨论】:
根据 Jinja 文档中的 quote,Jinja 引擎在 python 表达式方面受到限制:
...
Jinja2 不允许您将任意 Python 代码放入 模板也不允许所有 Python 表达式。 运营商是 仅限于最常见的表达方式和更高级的表达方式,例如 不支持列表推导和生成器表达式。这个 使模板引擎更易于维护,模板更多 可读。
也就是说,您应该在实际的 Python 代码中进行大部分数据处理,或者您正在使用 JS,只需将其作为变量传递并使用 JS 处理它,然后将其渲染并尽可能保持模板干净以便于维护。
编辑:受 Jinja 文档启发的解决方案:
这可能对你有用,我在 Jinja's docs 上找到的:
<ul>
{% for nb, word in t %}
<li><a href="">{{ word }}</a></li>
{% endfor %}
</ul>
【讨论】:
是的,这是attribute 方法:
{% set t = [(1, 'hello'), (2, 'world')] %}
{% set t1 = t|map(attribute=1)|list %}
{{ t1 }}
【讨论】: