为什么Django的reverse()在处理unicode时会失败?

3
这是一个django模型文件,但它并没有按照我的预期工作。 我希望to_url方法可以在urls.py文件中进行反向查找,并获取一个url,该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个回答

5
在你的to_url方法中,你需要确保d字典中的键不是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())

应该就能解决问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接