plantillas para descargar bootstrap django django-templates

descargar - Numérico para bucle en plantillas Django.



django templates bootstrap (16)

Debes usar " slice " en la plantilla, un ejemplo como este:

en views.py

contexts = { ''ALL_STORES'': Store.objects.all(), } return render_to_response(''store_list.html'', contexts, RequestContext(request, processors=[custom_processor]))

en store_list.html:

<ul> {% for store in ALL_STORES|slice:":10" %} <li class="store_item">{{ store.name }}</li> {% endfor %} </ul>

¿Cómo escribo un bucle numérico for en una plantilla de Django? Quiero decir algo como

for i = 1 to n


Desafortunadamente, eso no es compatible con el lenguaje de plantillas de Django. Hay un couple de suggestions , pero parecen un poco complejas. Simplemente pondría una variable en el contexto:

... render_to_response(''foo.html'', {..., ''range'': range(10), ...}, ...) ...

y en la plantilla:

{% for i in range %} ... {% endfor %}


En caso de que alguien más se encuentre con esta pregunta ... He creado una etiqueta de plantilla que le permite crear un range(...) : http://www.djangosnippets.org/snippets/1926/

Accepts the same arguments as the ''range'' builtin and creates a list containing the result of ''range''. Syntax: {% mkrange [start,] stop[, step] as context_name %} For example: {% mkrange 5 10 2 as some_range %} {% for i in some_range %} {{ i }}: Something I want to repeat/n {% endfor %} Produces: 5: Something I want to repeat 7: Something I want to repeat 9: Something I want to repeat


Este método es compatible con todas las funciones de la función de range([start,] stop[, step]) estándar range([start,] stop[, step])

<app>/templatetags/range.py

from django import template register = template.Library() @register.filter(name=''range'') def _range(_min, args=None): _max, _step = None, None if args: if not isinstance(args, int): _max, _step = map(int, args.split('','')) else: _max = args args = filter(None, (_min, _max, _step)) return range(*args)

Uso:

{% load range %} <p>stop 5 {% for value in 5|range %} {{ value }} {% endfor %} </p> <p>start 5 stop 10 {% for value in 5|range:10 %} {{ value }} {% endfor %} </p> <p>start 5 stop 10 step 2 {% for value in 5|range:"10,2" %} {{ value }} {% endfor %} </p>

Salida

<p>stop 5 0 1 2 3 4 </p> <p>start 5 stop 10 5 6 7 8 9 </p> <p>start 5 stop 10 step 2 5 7 9 </p>


Esto esencialmente requiere una función de range . Se generó un ticket de la característica de Django ( https://code.djangoproject.com/ticket/13088 ) para esto, pero se cerró como "no se solucionará" con el siguiente comentario.

Mi impresión de esta idea es que está intentando llevar a la programación en la plantilla. Si tiene una lista de opciones que deben representarse, deben calcularse en la vista, no en la plantilla. Si eso es tan simple como un rango de valores, que así sea.

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 pasar a la plantilla en el contexto.


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 "xxxxxxxxxxxxxxxxxxxx" %} {{ forloop.counter0 }} {% endfor %}

Ajuste la longitud de "xxxxxxxxxxxxxxxxxxxxxx" de acuerdo con sus necesidades. "xxx" para hacer solo 3 iteraciones, etc.


Me esforcé mucho en esta pregunta, y encuentro la mejor respuesta aquí: (de cómo hacer un bucle 7 veces en las plantillas de django )

Incluso puedes acceder al idx!

views.py:

context[''loop_times''] = range(1, 8)

html:

{% for i in loop_times %} <option value={{ i }}>{{ i }}</option> {% endfor %}


Mi opinión sobre este tema, creo que es la mejor. Mantengo un archivo my_filters.py en el directorio templatetags.

@register.filter(name=''times'') def times(number): return range(number)

Y lo usarías así:

{% load my_filters %} {% for i in 15|times %} <li>Item</li> {% endfor %}


No se pasa n sí mismo, sino que se range(n) [la lista de enteros de 0 a n-1 incluidos], desde su vista a su plantilla, y en la última se hace {% for i in therange %} ( Si insiste absolutamente en el índice basado en 1 en lugar del índice basado en 0 normal, puede usar forloop.counter en el cuerpo del bucle ;-).


Puede pasar un enlace de

{''n'' : range(n) }

a la plantilla, luego hacer

{% for i in n %} ... {% endfor %}

Tenga en cuenta que obtendrá un comportamiento basado en 0 (0, 1, ... n-1).

(Actualizado para compatibilidad con Python3)


Puede usar: {% with ''''|center: i as range %}


Si el número proviene de un modelo, creo que este es un buen parche para el modelo:

def iterableQuantity(self): return range(self.quantity)


Solo estoy tomando la respuesta popular un poco más lejos y la estoy haciendo más robusta. Esto le permite especificar cualquier punto de inicio, por lo que 0 o 1, por ejemplo. También utiliza la función de rango de Python, donde el final es uno menos, por ejemplo, se puede usar directamente con longitudes de lista.

@register.filter(name=''range'') def filter_range(start, end): return range(start, end)

Luego, en su plantilla solo incluya el archivo de etiqueta de plantilla anterior y use lo siguiente:

{% for c in 1|range:6 %} {{ c }} {% endfor %}

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.


Tal vez asi

{% for i in "x"|rjust:"100" %} ... {% endfor %}


Puedes pasar :

{''n'': rango (n)}

Para utilizar la plantilla:

{% para i en n%} ... {% endfor%}


{% with ''''|center:n as range %} {% for _ in range %} {{ forloop.counter }} {% endfor %} {% endwith %}