这是一个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
答案 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())
应该这样做。