Отримати довжину списку в шаблоні jinja2


315

Як отримати кількість елементів у списку в шаблоні jinja2?

Наприклад, у Python:

print(template.render(products=[???]))

і в jinja2

<span>You have {{what goes here?}} products</span>

Відповіді:


532
<span>You have {{products|length}} products</span>

Ви також можете використовувати цей синтаксис у виразах типу

{% if products|length > 1 %}

вбудовані фільтри jinja2 в документуються тут ; і конкретно, як ви вже знайшли, length(і його синонім count) задокументовано:

Поверніть кількість елементів послідовності чи відображення.

Отже, знову ж таки, як ви знайшли, {{products|count}}(або рівнозначно {{products|length}}) у вашому шаблоні буде вказано "кількість товарів" ("довжина списку")


Чи можемо ми перевірити також невизначеність? Мені доводиться використовувати {%, якщо продуктів немає ...%}, що досить втомлює
Nam G VU

@wvxvw це спрацьовує: {% set item_count = items | length %}доки itemsє список,
диктант

7

Коментар Алекса виглядає добре, але мене все ще бентежить використання діапазону. Наступне працювало для мене, працюючи над умовою, використовуючи довжину в межах діапазону.

{% for i in range(0,(nums['list_users_response']['list_users_result']['users'])| length) %}
<li>    {{ nums['list_users_response']['list_users_result']['users'][i]['user_name'] }} </li>
{% endfor %}

2

У мене виникла проблема з довжиною None, що призводить до внутрішньої помилки сервера: TypeError: об’єкт типу 'NoneType' не має len ()

У моєму вирішенні просто відображається 0, якщо об'єкт "Ні", і обчислюють довжину інших типів, наприклад список у моєму випадку:

{{'0' if linked_contacts == None else linked_contacts|length}}

Ви не можете використовувати жодну вбудовану функцію для тестування на None . Перевірте більше тут: https://jinja.palletsprojects.com/en/2.10.x/templates/#none . Приклад
Войцех Якубас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.