2011-04-07 22 views
5

En una plantilla de Django, me gustaría añadir clases CSS a un DIV basado en ciertas "condiciones", por ejemplo:cómo representar de forma concisa if/else para especificar las clases CSS en Django plantillas

<div class="pkg-buildinfo 
      {% if v.release.version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
      {% if v.release.version == project.latest.version %}latest{% else %}notlatest{% endif %}"> 

(nota que v es una variable de bucle; todo esto es dentro de un bucle for)

lo anterior se suma clases CSS "activo" o "inactivo" y "último" o "notlatest" basado en dos condiciones.

Sin embargo, es difícil de leer y prolijo. Descubrí que el with statement no admite la asignación del valor de las expresiones/condiciones (a diferencia de las variables complejas), lo cual es una lástima. ¿Hay una mejor manera de hacer esto?

+0

@jammon - gracias por la edición, pero - se apoyaron en líneas múltiples valores de los atributos HTML? –

+0

¡Oh, buen punto! Tengo que buscar eso. – jammon

Respuesta

5

En su lugar, podría poner esa lógica en su vista y crear atributos en el objeto que estén "activos" o "inactivos", etc. Luego, solo tiene que acceder a los atributos en la plantilla.

3

se puede acortar un poco por la sentencia with:

{% with v.release.version as version %} 
<div class="pkg-buildinfo 
      {% if version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
      {% if version == project.latest.version %}latest{% else %}notlatest{% endif %}"> 
{% endwith %} 

pero sin duda sería mejor poner esa lógica en la vista:

context_data = { 
    'class_active': v.release.version == pkg.b.release.version and "active" or "inactive", 
    'class_latest': v.release.version == project.latest.version and "latest" or "notlatest", 
    ... } 

y en la plantilla:

<div class="pkg-buildinfo {{ class_active }} {{ class_latest }}" 
+0

Eso tendría que ser v.class_active ('v' es una variable de bucle) en lugar de class_active. –

3

Un filtro personalizado puede ser una buena alternativa.

@register.filter 
def active_class(obj, pkg): 
    if obj.release.version == pkg.b.release.version: 
     return 'active' 
    else: 
     return 'inactive' 

y utilizarlo en su plantilla:

<div class="pkg-buildinfo {{ obj|active_class:pkg }}" 
+0

Podría ser una sorpresa cuando lea mi código un año después ("¿necesita ver un lugar que no sean vistas y plantillas?" ... "¿por qué 'active_class' no es un método de la clase' obj'? "), pero por lo demás es bueno. –

Cuestiones relacionadas