Is there any way to get the model name of any objects in django templates. Manually, we can try it by defining methods in models or using template tags... But is there any b
You can very easily access the content type of the page, this way you don't even need to poke into the specific
:
{% if pub.content_type.app_labeled_name == 'home | publication' %}
{% include "home/publication.html" with pub=pub.specific %}
{% endif %}
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/
Since 1.2 version and may be early Django has an attribute opts
into templates. The atribute is link to model._meta
For evidence you should look at source code into Github
It used into template very simple: {{opts}}
or {{opts.db_table}}
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 }}