django模板中对象的模型名称

时间:2011-07-04 12:41:26

标签: django django-models django-templates

有没有办法获取django模板中任何对象的模型名称。手动,我们可以通过在模型中定义方法或使用模板标签来尝试...但是有没有内置的方法?

5 个答案:

答案 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}}