Django tiene esta etiqueta genial llamada {% vacío %}, que te permite hacer esto:
{% for item in list %}
<tr><td>{{ item }}</td></tr>
{% empty %}
<tr><td>Nothing to show!</td></tr>
{% endfor %}
que es la abreviatura de
{% if list %}
{% for item in list %}
<tr><td>{{ item }}</td?</tr>
{% endfor %}
{% else %}
<tr><td>Nothing to show!</td></tr>
{% endif %}
Desde que cambié a jinja, realmente he extrañado esta etiqueta :(
Eso ya existe. Usa {% else %}
en un bucle for. Desafortunadamente teníamos más antes de que Django se creara vacío y cambiarle el nombre ahora para que coincida con la semántica de Django es un poco raro.
Oh ya veo. ¿Quizás poner una nota de eso en "Cambiar desde otros motores de plantilla" en la sección Django?
No veo esto en la documentación de conmutación . Se menciona en las estructuras de control : para la documentación, pero sería útil tenerlo en el documento de conmutación...
Si list
en el código es un generador y los bloques for
y if
funcionan de la misma manera que en Python, entonces la construcción if-for
no resuelve el problema porque los generadores siempre son veraces, además dicha construcción es menos idiomática que el bloque empty
.
No sé si puede agregar una bandera para verificar si se ha ejecutado el bucle, verificar NameError: name 'item' is not defined
o agregar una variable auxiliar a list(generator)
en el nivel de Jinja. De lo contrario, las únicas soluciones son agregar el bloque empty
o convencer a los desarrolladores de Python de que los generadores vacíos deberían ser falsos (para evitar comprobaciones feas mediante el manejo de StopIteration
y el elemento reventado "rechazando").
El bloque else
en Jinja ya funciona como el bloque empty
en Django. Aquí no es necesario ningún cambio.
Comentario más útil
Eso ya existe. Usa
{% else %}
en un bucle for. Desafortunadamente teníamos más antes de que Django se creara vacío y cambiarle el nombre ahora para que coincida con la semántica de Django es un poco raro.