我只是将这段代码写在一个HTML页面中。
{% for i, val in enumerate(['a', 'b', 'c']) %}
<td>
{{ val }}
</td>
{% endfor %}
UndefinedError: 'enumerate' is undefined
那么,Flask不支持enumerate吗?
正如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允许自动将变量注入到模板的上下文中。因此,如果您希望enumerate
内置函数在所有模板中都可用,这可能是一个不错的解决方案:
@app.context_processor
def inject_enumerate():
return dict(enumerate=enumerate)
感谢Sean Vieira提出这个建议。
Flask使用Jinja2来渲染模板,Jinja2具有类似于Python语法但却不是Python的特点。
您可以在Python代码中进行以下操作:
my_dict = enumerate(some_list)
render_template('page.html', my_dict=my_dict)
loop.index0
可以解决问题。 - Eyong Kevin Enowanyo@app.route("/xxx")
def xxx():
html = []
for (i, val) in enumerate(["a", "b", "c"]):
html.append(f"""<td> {i} {val}</td>""")
cells = "\n".join(html)
return render_template("xxx.html", cells=cells)
在模板中:
<tr>
{{cells|safe}}
</tr>
当你进行Python编程时,你总是拥有完整的Python环境,而模板不会与Python代码混淆。
Template().render(something)
是什么意思。因此,还有改进的空间。 - Pygmalionloop.index
也存在,它从索引1
开始,而不像loop.index0
从0
开始。 - Eyong Kevin Enowanyo