Это не ошибка. Если вы посмотрите на определение 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, который был инициализирован с соответствующим ключом / значениями.