如何在Django模板中获取对象的类?

时间:2009-04-21 09:57:01

标签: django

如果我有一个需要类似布局的对象列表,但需要根据对象类设置一些属性,那么在和其他 xx <时,如何获取类名? / strong>值在模板中不可用。

{% for obj in objects %}
 <div class={{obj.__class__.__name__}}
   ..
 </div>
{% endfor }}

这里可能还有一种替代方法......

4 个答案:

答案 0 :(得分:30)

您还可以编写自定义过滤器。我的use case用于检查Django表单中的html元素是否为复选框。此代码已经过Django 1.4测试。

我按照Custom Filters的说明进行操作。我的过滤器代码看起来就像这样。

myapp/templatetags/class_tag.py

from django import template
register = template.Library()
@register.filter(name='get_class')
def get_class(value):
  return value.__class__.__name__

在模板文件中:

{% load class_tag %}

{% if Object|get_class == 'AClassName' %}
 do something
{% endif %}


{{ Object|get_class }}

答案 1 :(得分:12)

一点点肮脏的解决方案

如果对象是属于模型的QuerySet,则可以向模型添加自定义方法。

 class mymodel(models.Model):
     foo = models........


 def get_cname(self):
    class_name = ....
    return class_name 

然后在您的模板中,您可以尝试:

{% for obj in objects %}
   <div class="{{obj.get_cname}}">
     ..
  </div>
{% endfor }}

答案 2 :(得分:1)

有点简单;假设您的布局是单个模型的列表:

class ObjectListView(ListView):
    model = Person
    template_name = 'object_list.html'

    def model_name(self):
        return self.model._meta.verbose_name

然后在object_list.html

{% for obj in object_list %}
    <div class="{{view.model_name}}">...</div>
{% endfor }}

答案 3 :(得分:0)

David建议使用自定义过滤器,如果您需要多个类的话,那就太棒了。

Django文档忽略了提到dev服务器不会自动检测新的模板标记,但是,直到我手动重新启动它,我才被TemplateSyntaxError class_tag is not a registered tag library困住。