このコードを 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 に感謝します。