Почему Django reverse () не работает с юникодом? - PullRequest
3 голосов
/ 21 апреля 2010

Вот файл моделей 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, которая, как я считаю, должна нормально работать с методом reverse (), который вызывается декоратором постоянных ссылок, однако это приводит к:

TypeError: reverse() keywords must be strings

1 Ответ

5 голосов
/ 21 апреля 2010

В вашем методе 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())

должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...