невозможно urlencode () после сохранения QueryDict в сеансе - PullRequest
4 голосов
/ 15 августа 2011

Я пытался опубликовать это в группе django-users (http://groups.google.com/group/django-users/browse_thread/thread/8572d7f4075cfe0e), но не получил ответа. Может быть, здесь я получу больше помощи.

Я храню request.GET в сеансе:

request.session['query_string'] = request.GET

затем я получаю значение на другой странице и пытаюсь набрать код QueryDict:

context['query_string'] = request.session['query_string'].urlencode()

в моем контексте я получаю строковое представление питона Объект QueryDict вместо ожидаемого key0=value0&key1=value1&... строка.

Если вместо QueryDict я сохраню строку с кодированием в сеанс, все работает конечно:

request.session['query_string'] = request.GET.urlencode()

это ошибка?

1 Ответ

0 голосов
/ 15 августа 2011

Это не ошибка. Если вы посмотрите на определение QueryDict (см. https://github.com/django/django/blob/master/django/http/init.py),), в нем прямо сказано, что оно неизменное, если вы не создадите его копию.

Чтобы продемонстрировать это, вот что у меня есть в моей оболочке Python,

>>> from django.http import QueryDict
>>> q1 = QueryDict('', mutable=False)
>>> q2 = QueryDict('', mutable=True)
>>> q1['next'] = '/a&b/'
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/kenny/Desktop/Kreybits/locker/python/lib/python2.7/site-packages/django/http/__init__.py", line 357, in __setitem__
    self._assert_mutable()
  File "/Users/kenny/Desktop/Kreybits/locker/python/lib/python2.7/site-packages/django/http/__init__.py", line 354, in _assert_mutable
    raise AttributeError("This QueryDict instance is immutable")
AttributeError: This QueryDict instance is immutable
>>> q2['next'] = '/a&b/'
>>> q2.urlencode()
'next=%2Fa%26b%2F'

По умолчанию для аргумента mutable установлено значение False, и, поскольку request.session['query_string'] = request.GET инициализирует его пустым QueryDict для начала, вызов urlencode() возвращает вам только пустую строку, в то время как request.session['query_string'] = request.GET.urlencode() работает, потому что вы работа с QueryDict, который был инициализирован с соответствующим ключом / значениями.

...