tutorial examples bootstrap django django-templates

examples - Colorear filas alternativas en la plantilla de Django con más de un conjunto de filas



href django (7)

Las plantillas de Django ofrecen el cycle etiqueta incorporado para alternar entre varios valores en diferentes puntos de una plantilla (o para un bucle en una plantilla) pero esta etiqueta no se restablece cuando se accede a ella en un ámbito fuera de la definición del cycle . Es decir, si tiene dos o más listas en su plantilla, las filas de todas las cuales le gustaría usar algunas definiciones CSS odd y even , la primera fila de una lista continuará donde la última dejó, no con una nueva iteración de las elecciones ( odd y even )

Por ejemplo, en el siguiente código, si el primer blog tiene un número impar de entradas, entonces la primera entrada en un segundo blog comenzará de manera even , cuando quiero que comience en odd .

{% for blog in blogs %} {% for entry in blog.entries %} <div class="{% cycle ''odd'' ''even'' %}" id="{{entry.id}}"> {{entry.text}} </div> {% endfor %} {% endfor %}

Intenté obviar esto parcheando con la etiqueta resetcycle ofrecida aquí:

Boleto Django: la etiqueta del ciclo debe restablecerse después de salir del alcance

en vano. (El código no funcionó para mí)

También traté de mover mi bucle interno a una etiqueta personalizada, pero tampoco funcionó, tal vez porque el ciclo de compilación / renderizado mueve el ciclo nuevamente al ciclo externo. (Independientemente de por qué, no funcionó para mí.)

¿Cómo puedo lograr esta simple tarea? Preferiría no crear una estructura de datos en mi opinión con esta información precompilada; eso parece innecesario Gracias por adelantado.


Termino haciéndolo, con el forloop.counter0 - ¡Funciona muy bien!

{% for product in products %} {% if forloop.counter0|divisibleby:4 %}<div class="clear"></div>{% endif %} <div class="product {% if forloop.counter0|divisibleby:4 %}col{% else %}col20{% endif %}"> Lorem Ipsum is simply dummy text </div> {% endfor %}


Hay una forma de hacerlo en el lado del servidor con un iterador que no conserva una copia simultánea de todas las entradas:

import itertools return render_to_response(''template.html'', { "flattened_entries": itertools.chain(*(blog.entries for blog in blogs)), })


La respuesta más fácil podría ser: "renunciar y usar jQuery". Si eso es aceptable, probablemente sea más fácil que pelear con las plantillas de Django por algo tan simple.


La solución más fácil (hasta que se arregle y aplique el parche de resetcycle) es usar el filtro incorporado "divisibleby" con forloop.counter:

{% for entry in blog.entries %} <div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}"> {{ entry.text }} </div> {% endfor %}

Un poco más detallado, pero no es difícil de entender y funciona muy bien.


Renunciar y utilizar el sistema de plantillas Jinja2

Renuncié al lenguaje de plantilla django, es muy restringido en lo que puedes hacer con él. Jinja2 usa la misma sintaxis que usa la plantilla django, pero agrega muchas mejoras sobre ella.

EDITAR / NOTA (Sé que suena como un gran cambio solo por un problema menor, pero en realidad apuesto a que siempre te encuentras luchando contra el sistema de plantillas por defecto en django, así que realmente vale la pena y creo que te hará más productivo en a la larga.)

Puede leer este artículo escrito por su autor , aunque es técnico, menciona el problema de la etiqueta {% cycle%} en django.

Jinja no tiene una etiqueta de ciclo, tiene un método de ciclo en el ciclo:

{% for user in users %} <li class="{{ loop.cycle(''odd'', ''even'') }}">{{ user }}</li> {% endfor %}

Una gran ventaja de Jinja2 es que le permite usar la lógica para la presentación, por lo que si tiene una lista de imágenes, puede ponerlas en una tabla, porque puede comenzar una nueva fila dentro de una tabla cada N elementos, vea, puedes hacer por ejemplo:

{% if loop.index is divisibleby(5) %} </tr> {% if not loop.last %} <tr> {% endif %} {% endif %}

también puedes usar expresiones matemáticas:

{% if x > 10 %}

y puede acceder a sus funciones de python directamente (pero se requiere cierta configuración para especificar qué funciones deberían estar expuestas para la plantilla)

{% for item in normal_python_function_that_returns_a_query_or_a_list() %}

incluso establecer variables ...

{% set variable_name = function_that_returns_an_object_or_something() %}