Flask 无法导入枚举?未定义错误:“枚举”未定义

问题描述 投票:0回答:4

我只是在 HTML 页面中编写此代码。

{% for i, val in enumerate(['a', 'b', 'c']) %}
    <td>
        {{ val }}
    </td>
{% endfor %}

UndefinedError: 'enumerate' is undefined

那么,Flask 不支持枚举?

python flask jinja2
4个回答
74
投票

正如 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 的建议。


6
投票

Flask 使用 Jinja2 来渲染你的模板,Jinja2 有类似的 python 语法,但它不是 python。

你能做什么?在你的Python代码中:

my_dict = enumerate(some_list)

然后在渲染模板时将字典发送给它:

render_template('page.html', my_dict=my_dict)

0
投票

我从不在模板中使用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 代码混淆。


0
投票

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/

© www.soinside.com 2019 - 2024. All rights reserved.