【发布时间】:2013-10-11 10:40:03
【问题描述】:
我传递给模板的对象有一个名为 active_children 的方法,它返回一个 OrderedDict,其键是 Python 类(确切地说是 Django 模型),值是那些应用了某些过滤器的模型的 QuerySet。
我在模板中有如下内容:
{% 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'>, [])]。证明类键确实不是 None。
如果我从第一个示例中删除 {{ cls }} 行,我也不会收到错误消息。然后 QuerySet 中的所有对象都被正确打印了。
有没有办法我仍然可以在 Django 模板中使用类作为字典键?
我正在使用 Django 1.4.5 / Python 2.7.3。
【问题讨论】:
-
似乎容易出错的类没有
__unicode__method -
我不确定,如果这是您需要的,但是您可以尝试:
{{ cls|default_if_none:"" }} -
@HeddevanderHeide 谢谢,但这有什么帮助?
unicode(Klass)应该总是返回一个 unicode 字符串,即使类没有定义它。 Django 是否专门寻找__unicode__属性?不过,我只是通过向所有类添加__unicode__方法对此进行了测试,但仍然遇到相同的错误。 :-/ -
你的输出是什么:
from ... import YourClass; print YourClass; unicode(YourClass);在 shell 上? -
我得到的输出与模板中包含
{{ object.active_children.items }}时相同,即<class 'app.MyModel'>。请注意,无论是否定义了__unicode__,都会发生这种情况。你可以在一个虚拟类上自己尝试:class Test(object): pass,print Test, unicode(Test), str(Test):所有 3 个都返回相同的东西。
标签: python django django-templates