Колба не может импортировать перечисление? UndefinedError: 'enumerate' не определено

Я просто пишу этот код на HTML-странице.

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

UndefinedError: 'enumerate' is undefined

Итак, колба не поддерживает перечисление?

2 ответов


как говорит или Дуан, Jinja2 имеет свой собственный язык. Похоже на Python, но это не Python. Итак, питон enumerate встроенная функция не является частью Jinja2 template engine. Есть, однако, некоторые альтернативы, которые вы можете использовать:

если вы хотите перечислить элементы в список, вы можете использовать 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)

спасибо Шону Виейре за это предложение.


Flask используйте Jinja2 для рендеринга шаблона, Jinja2 имеет аналогичный синтаксис python, но это не python.

что можно сделать? В вашем коде python:

my_dict = enumerate(some_list)

затем при рендеринге шаблона отправьте ему дикт:

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