2010-04-20 53 views
3

這是一個django模型文件,不能像我期望的那樣工作。 我期望to_url方法在urls.py文件中進行反向查找,並獲得一個url,它將對應於使用Arguments模型提供的參數調用該視圖。爲什麼Django reverse()與unicode失敗?

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字符串,我相信一個字典,能很好地工作,將被永久裝飾被稱爲反向()方法,但是,它導致在:

TypeError: reverse() keywords must be strings 

回答

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()) 

應該做的伎倆。