Как получить класс объекта в шаблоне Django?

Если у меня есть список объектов, для которых требуются аналогичные макеты, но для них требуется некоторый набор атрибутов, основанный на классе объекта, как я могу получить имя класса в классе и других xx не доступны в шаблонах.

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

Возможно, есть альтернативный подход, который я здесь отсутствует.

Ответ 1

Немного грязное решение

Если объекты представляют собой QuerySet, принадлежащие модели, вы можете добавить к своей модели собственный метод.

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


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

то в шаблоне вы можете попробовать:

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

Ответ 2

Вы также можете написать собственный фильтр. Мой вариант использования состоял в том, чтобы проверить, был ли флажок html в форме Django. Этот код был протестирован с Django 1.4.

Я выполнил инструкции Пользовательские фильтры. Мой код фильтра выглядит как таковой.

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

В файле шаблона:

{% load class_tag %}

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


{{ Object|get_class }}

Ответ 3

немного проще; предполагая, что ваш макет - это список одной модели:

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

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

Тогда в object_list.html:

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

Ответ 4

Предложение Дэвида о настраиваемом фильтре отлично, если вам нужно это для нескольких классов.

Документы Django не упоминают, что dev-сервер не будет автоматически обнаруживать новые templatetags, поэтому, пока я не перезапустил его вручную, я застрял с TemplateSyntaxError class_tag is not a registered tag library.

.