2013-10-04 38 views
1

我传递给模板的对象具有一个名为active_children的方法,该方法返回键为Python类(准确地说是Django模型)的键OrderedDict,并为这些键的QuerySets应用了某些过滤器的模型。使用类作为Django模板中的键来迭代字典项目

我有类似的东西在模板中的以下内容:

{% for cls, objs in object.active_children.items %} 
    {{ cls }} 
    {% for obj in objs %} 
     {{ obj }} 
    {% endfor %} 
{% endfor %} 

这在与{{ cls }}行返回错误Error during template rendering. coercing to Unicode: need string or buffer, NoneType found

但是,如果我改变了这一切本:

{{ object.active_children.items }} 

然后,我没有得到一个错误,看到页面上的输出[(<class 'app.MyModel'>, [<MyModel:1>, <MyModel:2>, <MyModel:3>]), (<class 'app.AnotherModel'>, [])]。证明课程关键的确不是无。

如果我从第一个示例中删除{{ cls }}行,我也不会收到错误。然后查询集中的所有对象都被正确打印。

有没有一种方法,我仍然可以在Django模板中使用类作为字典键?

我正在使用Django 1.4.5/Python 2.7.3。

+2

看来容易出错类没有一个'__unicode__' [方法](https://docs.djangoproject.com/en/dev/ref/unicode/#models) –

+0

我不是肯定的是,如果这是你所需要的,但是你可以尝试: '{{cls | default_if_none:“”}}' – Luke

+0

@HeddevanderHeide谢谢,但这会有帮助吗? 'unicode(Klass)'应该总是返回一个unicode字符串,即使这个类没有定义它。 Django是否专门查找'__unicode__'属性?虽然,我只是通过给所有类添加一个'__unicode__'方法来测试,并且仍然有相同的错误。 : -/ – imiric

回答

0

Django模板引擎不能强迫你的类为unicode这就是为什么需要__unicode____str__方法,例如

class Foo(models.Model): 
    attr = models.CharField(max_length=25) 

    def __unicode__(self): 
     return '{0}'.format(self.attr) # instead of None 
+0

看到我对这个问题的评论。另外,不是'__unicode__'在实例上调用(因此是'self' arg),而不是在类对象上调用? – imiric

+0

@imiric'__unicode__'在任何传递给它的对象上被调用,但是当你使用'{{cls}}'时,对象就是类本身,而不是类的一个实例。 – msw