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

Ale*_*eee 17 python jinja2 flask

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

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

UndefinedError: 'enumerate' is undefined
Run Code Online (Sandbox Code Playgroud)

那么,Flask不支持枚举?

dre*_*cat 35

正如Oruan所说,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()
Run Code Online (Sandbox Code Playgroud)

另一种选择是预先计算列表的枚举版本:

>>> t2 = """
... {% for i, val in l %}
...     <td>
...         {{ i }} {{ val }}
...     </td>
... {% endfor %}
... """
>>> Template(t2).render(l=enumerate(['a', 'b', 'c']))
Run Code Online (Sandbox Code Playgroud)

而另一个,甚至可以enumerate作为变量传递:

>>> t3 = """
... {% for i, val in enumerate(['a', 'b', 'c']) %}
...     <td>
...         {{ i }} {{ val }}
...     </td>
... {% endfor %}
... """
>>> Template(t3).render(enumerate=enumerate)
Run Code Online (Sandbox Code Playgroud)

Flask允许通过Context Processors将变量自动注入模板的上下文中.因此,如果您希望enumerate内置函数可用于所有模板,这可能是一个不错的解决方案:

@app.context_processor
def inject_enumerate():
    return dict(enumerate=enumerate)
Run Code Online (Sandbox Code Playgroud)

感谢Sean Vieira的建议.

  • 另一种选择是注册一个上下文处理器并在 Jinja 环境中从 Python 中公开您想要的内容。不错的清单,顺便说一句。 (2认同)

Or *_*uan 5

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

你可以做什么?在你的python代码中:

my_dict = enumerate(some_list)
Run Code Online (Sandbox Code Playgroud)

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

render_template('page.html', my_dict=my_dict)
Run Code Online (Sandbox Code Playgroud)