有没有办法获取django模板中任何对象的模型名称。手动,我们可以通过在模型中定义方法或使用模板标签来尝试...但是有没有内置的方法?
答案 0 :(得分:54)
object.__class__.__name__
或object._meta.object_name
应该为您提供模型类的名称。但是,无法在模板中使用,因为属性名称以下划线开头。
没有内置的方法从模板中获取该值,因此您必须定义返回该属性的模型方法,或者对于更通用/可重用的解决方案,使用模板过滤器: / p>
@register.filter
def to_class_name(value):
return value.__class__.__name__
您可以在模板中使用:
{{ obj | to_class_name }}
答案 1 :(得分:5)
您无法直接访问类名。做这样的事情:
{{ 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/
答案 2 :(得分:0)
Django为模型选项_meta添加了可公开访问的API,但是您仍然无法在模板中使用下划线来访问变量。使用模板过滤器:
@register.filter
def verbose_name(instance):
return instance._meta.verbose_name
在模板中:
{{ instance|verbose_name }}
我什至喜欢链接title
过滤器以大写我模板中的单词:
{{ instance|verbose_name|title }}
答案 3 :(得分:0)
您可以非常轻松地访问页面的内容类型,这种方式甚至不需要戳specific
:
{% if pub.content_type.app_labeled_name == 'home | publication' %}
{% include "home/publication.html" with pub=pub.specific %}
{% endif %}
答案 4 :(得分:-2)
从1.2版本开始,可能早期Django将一个属性opts
放入模板中。该属性链接到model._meta
有关证据,您应该look at source code into Github
它用于模板非常简单:{{opts}}
或{{opts.db_table}}