Подтвердить что ты не робот

Название модели объектов в шаблонах django

Есть ли способ получить имя модели для любых объектов в шаблонах django. В ручном режиме мы можем попробовать его, определив методы в моделях или используя теги шаблонов... Но есть ли какой-либо встроенный способ?

4b9b3361

Ответ 1

object.__class__.__name__ или object._meta.object_name должно указывать имя класса модели. Однако этот нельзя использовать в шаблонах, потому что имена атрибутов начинаются с подчеркивания.

Существует не встроенный способ получить это значение из шаблонов, поэтому вам нужно будет определить метод модели, который возвращает этот атрибут, или для более универсального/многоразового решения использовать фильтр шаблонов:

@register.filter
def to_class_name(value):
    return value.__class__.__name__

который вы можете использовать в своем шаблоне как:

{{ obj | to_class_name }}

Ответ 2

Вы не можете получить доступ к имени класса напрямую. Делать что-то вроде этого:

{{ object.__class__ }}

приведет к TemplateSyntaxError: Variables and attributes may not begin with underscores. Django не позволяет вам получить доступ к этим видам атрибутов. Соглашения Python означают, что они являются скрытыми деталями реализации, а не частью API-интерфейса объекта.

Вместо этого создайте фильтр шаблонов, а затем вы можете использовать его следующим образом:

{{ object|model_name_filter }}

Создание фильтров очень просто: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Ответ 3

Django добавил общедоступный API к параметрам модели под названием _meta, но вы по-прежнему не можете получить доступ к переменным с подчеркиванием в шаблоне. Используйте шаблонный фильтр:

@register.filter
def verbose_name(instance):
    return instance._meta.verbose_name

В шаблоне:

{{ instance|verbose_name }}

Мне даже нравится связывать фильтр title, чтобы использовать заглавные слова в моем шаблоне:

{{ instance|verbose_name|title }}

Ответ 4

Начиная с версии 1.2 и может быть ранней, Django имеет атрибут opts в шаблонах. Атрибут - ссылка на model._meta Для доказательства вы должны посмотреть исходный код в Github

Используется в шаблоне очень просто: {{opts}} или {{opts.db_table}}