Estoy buscando una manera de utilizar algo como el operador de módulo en django. Lo que estoy tratando de hacer es agregar un nombre de clase para cada cuarto elemento en un bucle.

Con el módulo tendría este aspecto:

{% for p in posts %}
    <div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}">
        <div class="preview">

        </div>
        <div class="overlay">

        </div>
        <h2>p.title</h2>
    </div>
{% endfor %}

Por supuesto, esto no funciona porque % es un carácter reservado. ¿Hay alguna otra manera de hacerlo?

  • ¿Incluso probarlo? Django proporciona la templatetag etiqueta, pero que cubre {%, %}, etc. (no %).
  • sí, lo he probado, pero me sale el siguiente error: no se Pudo analizar el resto: ‘%’ de ‘%’ supongo que es porque no sabe cómo reducir el modulor. El operador es también que no figuran en el docs docs.djangoproject.com/en/dev/ref/templates/builtins/…
InformationsquelleAutor underdoeg | 2011-12-13

4 Comentarios

  1. 197

    Necesita divisibleby, un built-in de django filtro.

    {% for p in posts %}
        <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
            <div class="preview">
    
            </div>
            <div class="overlay">
    
            </div>
            <h2>p.title</h2>
        </div>
    {% endfor %}
    • +1. Se olvidó de divisibleby, esto sería una gran opción también.
    • ah, sí, eso es exactamente. utilizando el ciclo de ahora, pero bueno para referencia en el futuro. Yo no quiero usar el ciclo con modulor 100 o algo 🙂 en Realidad soy subir para marcar la respuesta como correcta. porque se centra en modulor y no una solución…
  2. 13

    No se puede utilizar el operador de módulo en Django etiquetas de plantilla, pero sería muy fácil escribir un filtro para hacerlo. Algo como esto debería funcionar:

    @register.filter
    def modulo(num, val):
        return num % val

    Y luego:

    {% ifequal forloop.counter0|modulo:4 0 %}

    Incluso se podría hacer algo como esto en su lugar:

    @register.filter
    def modulo(num, val):
        return num % val == 0

    Y luego:

    {% if forloop.counter0|modulo:4 %}

    O puede utilizar la cycle etiqueta:

    <div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
  3. 8

    Bootstrap filas y columnas de ejemplo.
    Nueva fila cada 4 elementos. También cerca de la última fila, incluso si hay menos de 4 elementos.

    myapp/templatetags/my_tags.py

    from django import template
    
    register = template.Library()
    
    @register.filter
    def modulo(num, val):
        return num % val

    plantilla html

    {% load my_tags %}
    
    {% for item in all_items %} 
        {% if forloop.counter|modulo:4 == 1 %}
            <div class="row">
        {% endif %}
    
            <div class="col-sm-3">
                {{ item }}
            </div>
    
        {% if forloop.last or forloop.counter|modulo:4 == 0 %}
            </div>
        {% endif %}
    
    {% endfor %}
    • Esta es la mejor respuesta porque describe lo que necesitaba directorio será creado y se describe la necesidad de cargar la plantilla personalizada en la plantilla de html también. Gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here