Come faccio a ottenere la classe di un oggetto all’interno di un Django modello?

Se ho una lista di oggetti che richiedono un layout simili ma hai bisogno di un set di attributi in base alla classe di oggetto come posso fare per ottenere il nome della classe, mentre classe e altri xx valori non sono disponibili all’interno di modelli.

{% per obj in oggetti %} 
<div class={{obj.__classe__.__nome__}} 
.. 
</div> 
{% endfor }} 

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

InformationsquelleAutor | 2009-04-21

 

4 Replies
  1. 14

    Un po ‘ sporca soluzione

    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 

    quindi nel modello si può provare:

    {% for obj in objects %}
       <div class="{{obj.get_cname}}">
         ..
      </div>
    {% endfor }}
    • yup, grazie, è esattamente quello che mi sono inventato io.
  2. 32

    È anche possibile creare un filtro personalizzato. Il mio caso d’uso era quello di verificare se un elemento html in un Django forma è una casella di controllo. Questo codice è stato testato con Django 1.4.

    Ho seguito le istruzioni su Filtri Personalizzati. Il mio filtro codice si presenta 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 di modello:

    {% load class_tag %}
    
    {% if Object|get_class == 'AClassName' %}
     do something
    {% endif %}
    
    
    {{ Object|get_class }}
    • questa è una soluzione migliore
    • Questo è il più Djangoesque soluzione.
    • grande, basta non dimenticare di riavviare il server dopo aver creato il tag, altrimenti si otterrà un messaggio di errore.
  3. 1

    un po ‘ più semplice; supponendo che il tuo layout è riportato 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

    Quindi in object_list.html:

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

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

    Django docs dimenticare che il dev server non in grado di rilevare nuovi templatetags automaticamente, tuttavia, in modo fino a quando ho riavviato il computer e a mano, sono stato bloccato da un TemplateSyntaxError class_tag is not a registered tag library.

    .

Lascia un commento