2011-12-13 9 views
86

Estoy buscando una forma de usar algo como el operador de módulo en django. Lo que intento hacer es agregar un nombre de clase a cada cuarto elemento de un ciclo.Módulo% en plantilla de Django

Con el módulo que se vería así:

{% 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 debido% es un carácter reservado. Hay alguna otra manera de hacer esto?

+0

¿Usted incluso probarlo? Django proporciona la etiqueta 'templatetag', pero eso cubre' {% ','%} ', etc. (no'% '). –

+4

sí, lo probé, pero me sale el siguiente error: No se pudo analizar el resto: '%' de '%' Supongo que es porque no sabe cómo cortar el modulor. El operador tampoco aparece en los documentos https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#operator – underdoeg

Respuesta

162

Necesita divisibleby, un filtro incorporado django.

{% 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 %} 
+3

+1. Me olvidé de 'divisibleby', esta sería una gran opción también. – mipadi

+0

ah sí, eso es exactamente. usando el ciclo ahora, pero es bueno para futuras referencias. No me gustaría usar cycle con modulor 100 o algo así :) De hecho, voy a marcar esta respuesta como la correcta. porque se centra en el modulor y no en una solución alternativa ... – underdoeg

11

No se puede usar el operador de módulo en las etiquetas de plantilla de Django, pero sería bastante 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 podría hacer algo como esto, en lugar:

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

Y luego:

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

O usted podría utilizar el cycle etiqueta:

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

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

miaplicacion/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 %} 
+2

Esta es la mejor respuesta porque describe qué directorio se debe crear y describe la necesidad de cargar la plantilla personalizada también en la plantilla html. Gracias. – ifelsemonkey

Cuestiones relacionadas