2009-04-21 11 views
11

Se si dispone di un elenco di oggetti che richiedono layout simili ma richiedono un set di attributi basato sulla classe dell'oggetto, è possibile ottenere il nome della classe mentre classe e altri valori xx non sono disponibili nei modelli.Come ottengo la classe di un oggetto all'interno di un modello Django?

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

Probabilmente c'è un approccio alternativo mi manca qui ..

risposta

10

Un po soluzione sporca

Se gli oggetti è un QuerySet che appartengono a un modello, è possibile aggiungere un metodo personalizzato per il tuo modello

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


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

poi nel modello si può provare:

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

sì, grazie - questo è esattamente quello che ho trovato. –

26

È possibile anche scrivere un filtro personalizzato. Il mio use case doveva verificare se un elemento html in un modulo di Django fosse o meno una casella di controllo. Questo codice è stato testato con Django 1.4.

Ho seguito le istruzioni su Custom Filters. Il mio codice di filtro appare come tale.

In 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__ 

Nel file template:

{% load class_tag %} 

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


{{ Object|get_class }} 
+1

questa è una soluzione migliore –

0

un po 'più semplice; assumendo il layout è un elenco di un unico modello:

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

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

Poi nel object_list.html: suggerimento

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

di David di un filtro personalizzato è grande se avete bisogno di questo per varie classi.

Il Django docs trascurare di menzionare che il server dev non rileverà nuove templatetags automaticamente, tuttavia, in modo fino a quando ho ricominciato a mano sono rimasto bloccato con un TemplateSyntaxError class_tag is not a registered tag library.

.

Problemi correlati