这不是错误。如果您查看QueryDict定义(请参阅https://github.com/django/django/blob/master/django/http/init .py ),它明确表示它是不可变的,除非您创建它的副本。
为了证明这一点,这是我的 Python shell 中的内容,
>>> 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()只会在工作时返回一个空 str,request.session['query_string'] = request.GET.urlencode()因为您正在使用已使用适当的键/值初始化的 QueryDict。