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 built-in way?
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 built-in way?
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 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 %}
This answer demonstrates a practical use case. In my app each model has a generic.CreateView named name=”<model>-create” in urls.py; namespaced/referenced as {% url <app>:<model>-create %} in those templates which need to link to it. Each model has a generic.ListView rendered by <app>/templates/<app>/<model>_list.html. I wanted to include a button at the bottom of each rendered list view to link to the corresponding create view. To ensure consistency across multiple list views I wanted to do this in a base template which each list view template could extend upon. To do this I needed to be able to reference the model name in a template. Here’s how I did it.
$ mkdir <app>/templatetags
$ touch <app>/templatetags/__init__.py
$ vi <app>/templatetags/tags.py
from django import template
register = template.Library()
# this filter allows any template to reference an instance’s model name as <instance>|class_name
@register.filter(name="class_name")
def class_name(instance):
return instance._meta.model.__name__
$ vi <app>/templates/base_list.html
~
{% with name=object_list|first|class_name|lower %}
<button onclick="location.href='{% url request.resolver_match.app_name|add:':'|add:name|add:'-create' %}';" title="create"><i class="fa fa-plus"></i></button>
{% endwith %}
* substitute <app>, <model>, and <instance> for your own names.