Flask无法导入enumerate?UndefinedError: 'enumerate'未定义。

27

我只是将这段代码写在一个HTML页面中。

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

UndefinedError: 'enumerate' is undefined

那么,Flask不支持enumerate吗?

3个回答

72

正如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提出这个建议。


2
另一个选项是注册上下文处理器并在Jinja环境中公开Python中所需的内容。顺便说一下,这是个不错的列表。 - Sean Vieira
@SeanVieira 不错的解决方案。我已将该选项添加到列表中。希望这正是你想要的。 - dreyescat
+1 感谢您的答案。我很难理解它-我需要充足的时间来弄清楚Template().render(something)是什么意思。因此,还有改进的空间。 - Pygmalion
感谢所有人提供这个解决方案。需要注意的是,loop.index 也存在,它从索引 1 开始,而不像 loop.index00 开始。 - Eyong Kevin Enowanyo

5

Flask使用Jinja2来渲染模板,Jinja2具有类似于Python语法但却不是Python的特点。

您可以在Python代码中进行以下操作:

my_dict = enumerate(some_list)

然后在渲染模板时将字典发送给它:
render_template('page.html', my_dict=my_dict)

非常感谢您。但是我认为在枚举的情况下,loop.index0 可以解决问题。 - Eyong Kevin Enowanyo

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代码混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接