Как получить класс объекта в шаблоне 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
.
.