O Django tem essa tag muito legal chamada {% empty %}, que permite fazer isso:
{% for item in list %}
<tr><td>{{ item }}</td></tr>
{% empty %}
<tr><td>Nothing to show!</td></tr>
{% endfor %}
que é curto para
{% if list %}
{% for item in list %}
<tr><td>{{ item }}</td?</tr>
{% endfor %}
{% else %}
<tr><td>Nothing to show!</td></tr>
{% endif %}
Desde que mudei para jinja, senti muita falta dessa tag :(
Isso já existe. Use {% else %}
em um loop for. Infelizmente, tínhamos mais antes do Django criar vazio e renomeá-lo agora para corresponder à semântica do Django é meio estranho.
Oh, eu vejo. Talvez coloque uma nota disso em "Mudando de outros motores de modelo" na seção django?
Eu não vejo isso na documentação de comutação . É mencionado nas estruturas de controle : para documentação, mas seria útil tê-lo no documento de comutação...
Se list
no código é um gerador e os blocos for
e if
funcionam da mesma maneira que em Python, a construção if-for
não resolve o problema porque os geradores são sempre verdadeiros, além de tal construção ser menos idiomática que o bloco empty
.
Não sei se você pode adicionar um sinalizador para verificar se o loop foi executado, verifique NameError: name 'item' is not defined
ou adicione uma variável auxiliar a list(generator)
no nível Jinja. Caso contrário, as únicas soluções são adicionar o bloco empty
ou convencer os desenvolvedores de Python de que geradores vazios devem ser falsos (para evitar verificações feias manipulando StopIteration
e "empurrando" o item pop).
O bloco else
no Jinja já funciona como o bloco empty
no Django. Nenhuma mudança é necessária aqui.
Comentários muito úteis
Isso já existe. Use
{% else %}
em um loop for. Infelizmente, tínhamos mais antes do Django criar vazio e renomeá-lo agora para corresponder à semântica do Django é meio estranho.