如果我有一个需要类似布局的对象列表,但需要根据对象类设置一些属性,那么在类和其他 xx <时,如何获取类名? / strong>值在模板中不可用。
{% for obj in objects %} <div class={{obj.__class__.__name__}} .. </div> {% endfor }}
这里可能还有一种替代方法......
答案 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
困住。