¿Cómo escribo un for
bucle numérico en una plantilla de Django? Me refiero a algo como
for i = 1 to n
¿Cómo escribo un for
bucle numérico en una plantilla de Django? Me refiero a algo como
for i = 1 to n
He usado una técnica simple que funciona bien para casos pequeños sin etiquetas especiales y sin contexto adicional. A veces esto es útil.
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
fuente
Desafortunadamente, eso no es compatible con el lenguaje de plantilla Django. Hay un par de sugerencias , pero parecen un poco complejas. Simplemente pondría una variable en el contexto:
y en la plantilla:
fuente
Mi opinión sobre este tema, creo que es la mejor. Mantengo my_filters.py en el directorio templatetags.
Y usarías así:
fuente
range(1, 16)
obtener números a partir del 1, no del 0.from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Luego se acostumbra como{% for i in 1|range:6 %}{% endfor %}
. Vea la respuesta completa a continuación ...try: return range(number) except: return []
. De esa manera, nunca genera un error y devuelve una matriz vacía (similar a cómo funciona la mayoría de las funciones de plantilla).Tal vez así?
fuente
Puede pasar un enlace de
a la plantilla, luego haz
Tenga en cuenta que obtendrá un comportamiento basado en 0 (0, 1, ... n-1).
(Actualizado para compatibilidad con Python3)
fuente
range(n)
en python 3, si no recuerdo mal, xrange fue desaprobadoNo se pasa a
n
sí mismo, sino más bienrange(n)
[incluye la lista de enteros de 0 a n-1], desde su punto de vista hasta su plantilla, y en el último lo hace{% for i in therange %}
(si insiste absolutamente en 0 basado en 1 en lugar del 0 normal) basado en índices que puede usarforloop.counter
en el cuerpo del bucle ;-).fuente
En caso de que alguien más se encuentre con esta pregunta ... He creado una etiqueta de plantilla que le permite crear
range(...)
: http://www.djangosnippets.org/snippets/1926/fuente
Intenté mucho esta pregunta, y encuentro la mejor respuesta aquí: (de cómo recorrer 7 veces en las plantillas de django )
¡Incluso puedes acceder al idx!
views.py:
html:
fuente
Puedes pasar :
{'n': rango (n)}
Para usar la plantilla:
{% para i en n%} ... {% endfor%}
fuente
Deberías usar " slice " en la plantilla, un ejemplo como este:
en views.py
en store_list.html:
fuente
Este método admite toda la funcionalidad de la
range([start,] stop[, step])
función estándar .<app>/templatetags/range.py
Uso:
Salida
fuente
for value in 0|range:"10,2"
.args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
Solo estoy llevando la respuesta popular un poco más allá y haciéndola más robusta. Esto le permite especificar cualquier punto de inicio, por ejemplo, 0 o 1. También usa la función de rango de Python donde el final es uno menos, por lo que puede usarse directamente con longitudes de lista, por ejemplo.
Luego, en su plantilla, simplemente incluya el archivo de etiqueta de plantilla anterior y use lo siguiente:
Ahora puede hacer 1-6 en lugar de solo 0-6 o codificarlo. Agregar un paso requeriría una etiqueta de plantilla, esto debería cubrir más casos de uso, por lo que es un paso adelante.
fuente
Esto esencialmente requiere una
range
función. Se generó un ticket de función de Django ( https://code.djangoproject.com/ticket/13088 ) para esto, pero se cerró como "no se solucionará" con el siguiente comentario.Tienen un buen punto: se supone que las plantillas son representaciones muy simples de la vista. Debe crear los datos requeridos limitados en la vista y pasarlos a la plantilla en el contexto.
fuente
Puedes usar:
{% with ''|center: i as range %}
fuente
Si el número proviene de un modelo, creo que este es un buen parche para el modelo:
fuente
Para aquellos que buscan una respuesta simple, solo necesitan mostrar una cantidad de valores, digamos 3 de 100 publicaciones, por ejemplo, simplemente agreguen
{% for post in posts|slice:"3" %}
y repita normalmente y solo se agregarán 3 publicaciones.fuente
fuente