Model name of objects in django templates

object.__class__.__name__ or object._meta.object_name should give you the name of the model class. However, this cannot be used in templates because the attribute names start with an underscore.

There isn't a built in way to get at that value from the templates, so you'll have to define a model method that returns that attribute, or for a more generic/reusable solution, use a template filter:

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

which you can use in your template as:

{{ obj | to_class_name }}

Django added a publicly accessible API to model options called _meta, but you still can't access variables with an underscore in the template. Use a template filter:

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

In the template:

{{ instance|verbose_name }}

I even like to chain the title filter to capitalize the words in the my template:

{{ instance|verbose_name|title }}

You cannot access the class name directly. Doing something like this:

{{ object.__class__ }}

will cause a TemplateSyntaxError: Variables and attributes may not begin with underscores. Django doesn't let you access those sorts of attributes - Python conventions means they are hidden implementation details, not part of the object's API.

Create a template filter instead, and then you can use it as follows:

{{ object|model_name_filter }}

Creating filters is very easy: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/