我尝试将此发布到django-users组(http://groups.google.com/group/django-users/browse_thread/thread/8572d7f4075cfe0e),但没有得到回复。也许在这里我会得到更多的帮助。
我将request.GET
存储在会话中:
request.session['query_string'] = request.GET
然后我在另一个页面中检索该值并尝试对其进行urlencode 的QueryDict:
context['query_string'] = request.session['query_string'].urlencode()
在我的上下文中我得到了python的字符串表示形式
QueryDict对象而不是预期的key0=value0&key1=value1&...
字符串。
如果,而不是QueryDict,我将urlencoded字符串存储在 会议,当然一切正常:
request.session['query_string'] = request.GET.urlencode()
这是一个错误吗?
答案 0 :(得分:0)
这不是错误。如果您看一下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()
1}}有效,因为您正在使用已使用适当的键/值初始化的QueryDict。