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

2024-04-20 12:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

UndefinedError: 'enumerate' is undefined

那么,烧瓶不支持列举吗?


Tags: 代码infor烧瓶ishtmlval页面
2条回答

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

你能做什么?在python代码中:

my_dict = enumerate(some_list)

然后在呈现模板时,将dict发送给它:

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

正如段子所说,Jinja2有自己的语言。看起来像Python,但不是Python。因此Pythonenumerate内置函数不是Jinja2模板引擎的一部分。但是,您可以使用一些替代方案:

如果要枚举列表中的项,可以使用^{}循环特殊变量:

>>> 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)

感谢肖恩·维埃拉的建议。

相关问题 更多 >