我只是在 HTML 页面中编写此代码。
{% for i, val in enumerate(['a', 'b', 'c']) %}
<td>
{{ val }}
</td>
{% endfor %}
UndefinedError: 'enumerate' is undefined
那么,Flask 不支持枚举?
正如 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 的建议。
Flask 使用 Jinja2 来渲染你的模板,Jinja2 有类似的 python 语法,但它不是 python。
你能做什么?在你的Python代码中:
my_dict = enumerate(some_list)
然后在渲染模板时将字典发送给它:
render_template('page.html', my_dict=my_dict)
我从不在模板中使用Python。我在控制器中生成 HTML,将其放入变量中,然后让模板引用它。
在控制器中
@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 代码混淆。
Jinja2 不直接支持“enumerate”功能。但是,我们可以通过创建提供枚举功能的自定义 Jinja2 过滤器来解决此限制。
在 main.py 中 - 创建一个自定义过滤器函数来模仿“enumerate”。
from flask import Flask, render_template
app = Flask(__name__)
# Custom filter function to mimic enumerate
def jinja2_enumerate(iterable):
return enumerate(iterable)
# Add the custom filter to the Jinja environment
app.jinja_env.filters['enumerate'] = jinja2_enumerate
在您的模板中,example.html。
{% for i, val in ['a', 'b', 'c,]|enumerate %}
<td>
{{ val }}
</td>
文档:注册过滤器 - https://flask.palletsprojects.com/en/2.3.x/templatating/