Flask は enumerate をインポートできませんか? UndefinedError: 'enumerate' は未定義です 質問する

Flask は enumerate をインポートできませんか? UndefinedError: 'enumerate' は未定義です 質問する

このコードを HTML ページに記述するだけです。

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

UndefinedError: 'enumerate' is undefined

それで、Flask は列挙をサポートしていないのですか?

ベストアンサー1

Or Duan が言うように、Jinja2 には独自の言語があります。Python のように見えますが、Python ではありません。したがって、Pythonenumerate組み込み関数は Jinja2 テンプレート エンジンの一部ではありません。ただし、使用できる代替手段がいくつかあります。

リスト内の項目を列挙したい場合は、loop.index0ループ特殊変数:

>>> from jinja2 import Template

>>> t1 = """
... {% for val in ['a', 'b', 'c'] %}
...     <td>
...         {{ loop.index0 }} {{ val }}
...     </td>
... {% endfor %}
... """
>>> Template(t1).render()

もう 1 つのオプションは、リストの列挙バージョンを事前に計算することです。

>>> 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 に感謝します。

おすすめ記事