【问题标题】:Why is Django reverse() failing with unicode?为什么 Django reverse() 使用 unicode 失败?
【发布时间】:2010-04-20 22:10:14
【问题描述】:

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

【问题讨论】:

    标签: python django unicode


    【解决方案1】:

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

    应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 2012-04-21
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多