为什么Django reverse()失败了unicode?

时间:2010-04-20 22:10:14

标签: python django unicode

这是一个django模型文件,它没有像我期望的那样工作。 我希望to_url方法在urls.py文件中进行反向查找,并获得一个url,它对应于使用Arguments模型提供的参数调用该视图。

from django.db import models
class Element(models.Model):
    viewname = models.CharField(max_length = 200)
    arguments = models.ManyToManyField('Argument', null = True, blank = True )

    @models.permalink
    def to_url(self):
        d = dict( self.arguments.values_list('key', 'value') )
        return (self.viewname, (), d)
class Argument(models.Model):
    key = models.CharField(max_length=200)
    value = models.CharField(max_length=200)

值d最终成为从unicode字符串到另一个unicode字符串的字典,我相信,它应该可以通过permalink装饰器调用的reverse()方法正常工作,但是,它会导致:

TypeError: reverse() keywords must be strings

1 个答案:

答案 0 :(得分:5)

to_url方法中,您需要确保d dict中的键不是 Unicode字符串。这不是Django所特有的,它只是函数的关键字参数如何在Python中运行。这是一个简单的例子:

>>> def f(**kwargs): print kwargs
... 
>>> d1 = { u'foo': u'bar' }
>>> d2 = { 'foo': u'bar' }
>>> f(**d1)
TypeError: f() keywords must be strings
>>> f(**d2)
{'foo': u'bar'}

更改

d = dict( self.arguments.values_list('key', 'value') )

类似

d = dict((str(k), v) for k, v in self.arguments.values_list('key', 'value').iteritems())

应该这样做。