Obter comprimentos de uma lista em um modelo jinja2

315

Como obtenho o número de elementos em uma lista no modelo jinja2?

Por exemplo, em Python:

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

e em jinja2

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

Respostas:

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

Você também pode usar esta sintaxe em expressões como

{% if products|length > 1 %}

Os filtros internos do jinja2 estão documentados aqui ; e, especificamente, como você já encontrou length(e seu sinônimo count) está documentado para:

Retorne o número de itens de uma sequência ou mapeamento.

Então, novamente, como você encontrou {{products|count}}(ou equivalente {{products|length}}) em seu modelo, você fornecerá o "número de produtos" ("comprimento da lista")

Alex Martelli
fonte
Também podemos verificar indefinido? Eu tenho que usar {% if produtos é nenhum ...%}, que é bastante cansativo
Nam G VU
@wvxvw isso não funciona: {% set item_count = items | length %}contanto que itemsé uma lista, dict, etc.
kbolino
7

O comentário de Alex parece bom, mas eu ainda estava confuso com o uso do alcance. O seguinte funcionou para mim enquanto trabalhava em uma condição for usando comprimento dentro do alcance.

{% 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 %}
Ashwin
fonte
2

Ocorreu um problema com o comprimento de None, que leva ao erro interno do servidor: TypeError: o objeto do tipo 'NoneType' não possui len ()

Minha solução alternativa é apenas exibir 0 se o objeto for None e calcular o comprimento de outros tipos, como lista no meu caso:

{{'0' if linked_contacts == None else linked_contacts|length}}
Dmitri
fonte
Você não pode usar nenhuma função interna para testar a opção Nenhum . Confira mais aqui: https://jinja.palletsprojects.com/en/2.10.x/templates/#none . O exemplo está neste segmento: /programming/19614027/jinja2-template-variable-if-none-object-set-a-default-value
Wojciech Jakubas