【问题标题】:Iterate over dictionary items with classes as keys in Django templates在 Django 模板中使用类作为键迭代字典项
【发布时间】: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): passprint Test, unicode(Test), str(Test):所有 3 个都返回相同的东西。

标签: python django django-templates


【解决方案1】:

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

【讨论】:

  • 查看我对这个问题的评论。另外,__unicode__ 不是在实例上调用(因此是 self arg),而不是在类对象上调用?
  • @imiric __unicode__ 在传递给它的任何对象上调用,但是当您使用 {{ cls }} 时,该对象是类本身,而不是类的实例。
猜你喜欢
  • 2012-07-27
  • 2023-03-19
  • 2015-09-28
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多