我只是在HTML页面中编写此代码。
{% for i, val in enumerate(['a', 'b', 'c']) %}
<td>
{{ val }}
</td>
{% endfor %}
UndefinedError: 'enumerate' is undefined
那么,Flask不支持枚举?
答案 0 :(得分:28)
As Or Duan说,Jinja2有自己的语言。看起来像Python,但它不是Python。所以Python enumerate
内置函数不是Jinja2模板引擎的一部分。但是,您可以使用一些替代方案:
如果要枚举列表中的项目,可以使用loop.index0
循环特殊变量:
>>> from jinja2 import Template
>>> t1 = """
... {% for val in ['a', 'b', 'c'] %}
... <td>
... {{ loop.index0 }} {{ val }}
... </td>
... {% endfor %}
... """
>>> Template(t1).render()
另一种选择是预先计算列表的枚举版本:
>>> t2 = """
... {% for i, val in l %}
... <td>
... {{ i }} {{ val }}
... </td>
... {% endfor %}
... """
>>> Template(t2).render(l=enumerate(['a', 'b', 'c']))
还有另外一个,甚至可以将enumerate
作为变量传递:
>>> t3 = """
... {% for i, val in enumerate(['a', 'b', 'c']) %}
... <td>
... {{ i }} {{ val }}
... </td>
... {% endfor %}
... """
>>> Template(t3).render(enumerate=enumerate)
Flask允许通过Context Processors自动将变量注入模板的上下文中。因此,如果您希望enumerate
内置函数可用于所有模板,这可能是一个不错的解决方案:
@app.context_processor
def inject_enumerate():
return dict(enumerate=enumerate)
感谢Sean Vieira的建议。
答案 1 :(得分:3)
Flask使用Jinja2渲染你的模板,Jinja2有类似的python语法,但它不是python。
你能做什么?在您的python代码中:
my_dict = enumerate(some_list)
然后在渲染模板时将dict发送给它:
render_template('page.html', my_dict=my_dict)