2009-04-21 22 views
11

Si tengo una lista de objetos que requieren diseños similares pero necesito algún conjunto de atributos basado en la clase del objeto, ¿cómo puedo obtener el nombre de clase mientras clase y otros valores xx no están disponibles dentro de las plantillas.¿Cómo obtengo la clase de un objeto dentro de una plantilla de Django?

 
{% for obj in objects %} 
<div class={{obj.__class__.__name__}} 
    .. 
</div> 
{% endfor }} 

Probablemente hay un enfoque alternativo me falta aquí ..

Respuesta

10

Un poco de solución sucia

Si los objetos es un QuerySet que pertenecen a un modelo, puede agregar un método personalizado a tu modelo

class mymodel(models.Model): 
    foo = models........ 


def get_cname(self): 
    class_name = .... 
    return class_name 

entonces en su plantilla que puede probar:

{% for obj in objects %} 
    <div class="{{obj.get_cname}}"> 
    .. 
    </div> 
{% endfor }} 
+0

yup, gracias, eso es exactamente lo que se me ocurrió. –

26

También puede escribir un filtro personalizado. Mi use case fue para comprobar si un elemento html en un formulario de Django era o no una casilla de verificación. Este código ha sido probado con Django 1.4.

Seguí las instrucciones sobre Custom Filters. Mi código de filtro se ve así.

En myapp/templatetags/class_tag.py:

from django import template 
register = template.Library() 
@register.filter(name='get_class') 
def get_class(value): 
    return value.__class__.__name__ 

En el archivo de plantilla:

{% load class_tag %} 

{% if Object|get_class == 'AClassName' %} 
do something 
{% endif %} 


{{ Object|get_class }} 
+1

esta es una solución mejor –

0

un poco más simple; suponiendo que su diseño es una lista de un solo modelo:

class ObjectListView(ListView): 
    model = Person 
    template_name = 'object_list.html' 

    def model_name(self): 
     return self.model._meta.verbose_name 

Luego, en object_list.html: sugerencia de un filtro personalizado

{% for obj in object_list %} 
    <div class="{{view.model_name}}">...</div> 
{% endfor }} 
0

de David es grande si usted necesita esto para varias clases.

Los documentos de Django omiten mencionar que el servidor de desarrollo no detectará nuevas plantillas de etiquetas automáticamente, sin embargo, hasta que lo reinicié a mano me quedé con un TemplateSyntaxError class_tag is not a registered tag library.

.

Cuestiones relacionadas