python - 为什么 Django reverse() 使用 unicode 失败?

标签 python django unicode

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

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 字符串的字典,我相信它应该可以很好地与永久链接装饰器调用的 reverse() 方法一起工作,但是,它会导致:

TypeError: reverse() keywords must be strings

最佳答案

在您的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())

应该可以解决问题。

关于python - 为什么 Django reverse() 使用 unicode 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2679052/

相关文章:

python - 为什么在 Set-Cookie header 字段中找不到 CSRF token ?

python - 如何减少gensim中的字典大小?

python - 线性时间与时间二次时间

python - 如何修复 Django Translation ASCII 解码错误?

windows - SendInput() 和非英文字符和键盘布局

python - 返回工作日列表,从给定的工作日开始

python - 如何使用 postgresql 从 Django 中的两个表中检索数据

jquery - 使用ajax在Django中将数据下载为Excel文件

python - django 默认上下文变量

PHP PCRE 在测试和托管服务器上的差异