在 HttpRequest 对象中,GET 和 POST 属性得到的都是 django.http.QueryDict 所创建的实例。这是一个 django 自定义的类似字典的类,用来处理同一个键带多个值的情况。
在 python 原始字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTTL 表单中,通常会发生一个键有多个值的情况,例如
request.POST 和 request.GET 的 QueryDict 在一个正常的请求/响应过程中是不可变的。 若要获得可变的版本,需要使用 copy() 方法。
init
QueryDict.__init__(query_string=None, mutable=False, encoding=None)
这是一个构造函数,其中 query_string 需要一个字符串,例如:
>>> from django.http import QueryDict
>>> QueryDict('a=1&a=2&b=1')
如果 query_string 没有传入,则获得一个空的对象。
如果你想自己实例化一个对象,可以传递 mutable=True 使你所实例化的对象可变。当然 request.POST 和 request.GET 是 django 所创建的,也就是说除非改 django 源码,否则它们是不可变的。
对于设置的键和值,会从 encoding 转码成 Unicode。也就是说,如果传入的字符串 query_string 是 GBK 或者是 utf-8 的编码,将会自动转码成 Unicode,然后用做字典的键和值。如果 encoding = None,也就是没有设定的话,将使用 DEFAULT_CHARSET 的值,默认为:utf-8。
getitem
QueryDict.__getitem__(key)
返回给定的 key 的值。 如果 key 具有多个值,则返回 最后 (最新)的值。如果 key 不存在,则引发 django.utils.datastructures.MultiValueDictKeyError 。(它是Python 标准 KeyError 的一个子类,所以你仍然可以坚持捕获 KeyError)
setitem
QueryDict. __setitem__(key, value)
设置给定的 key 的值为 [value] (一个Python 列表,只有一个元素 value)。注意:只有对象是可以改变的时候才能使用,例如通过 copy() 方法创建的对象。
contains
QueryDict.__contains__(key)
如果 key 已经设置,则返回 True。 它让你可以做 if foo in request.GET
这样的操作。
get
QueryDict.get(key, default)
使用与上面 __getitem__()
相同的逻辑,当 key 不存在时返回一个默认值。
setdefault
QueryDict.setdefault(key, default)
类似标准字典的 setdefault() 方法,只是它在内部使用的是 __setitem__
。也就是说,当 key 已经存在时,返回其值,key 不存在时,返回 default,同时添加 key 和 default 到对象中。
update
QueryDict.update(other_dict)
接收一个 QueryDict 或标准字典。 类似标准字典的 update() 方法,但是它附加到当前字典项的后面,而不是替换掉它们。
>>> q = QueryDict('a=1', mutable=True) # 要可变的才能使用
>>> q.update({'a': '2'})
>>> q
>>> q.getlist('a')
[u'1', '2']
>>> q['a'] # returns the last
'2'
items
QueryDict.items()
类似标准字典的 items() 方法,返回一个由键值组成的元组的列表。但是它使用的是和 __getitem__
一样返回最新的值的逻辑。
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[(u'a', u'3')]
iteritems
类似标准字典的 iteritems() 方法,返回一个迭代对象。 类似 QueryDict.items(),使用的是和 __getitem__
一样的返回最新的值的逻辑。
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.iteritems()
iterlists
QueryDict.iterlists()
类似 QueryDict.iteritems(),返回一个包含键值对的元祖(key, value)迭代对象,value 是一个包括所有 key 的值的列表。
values
QueryDict.values()
类似标准字典的 values() 方法,但是它使用的是和 __getitem__
一样返回最新的值的逻辑。也就是返回一个所有键对应的最新值的列表。
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
[u'3']
itervalues
QueryDict.itervalues()
类似 QueryDict.values() ,只是它返回的是一个迭代器。
copy
QueryDict.copy()
返回对象的副本,使用 Python 标准库中的 copy.deepcopy()。此副本是可变的即使原始对象是不可变的。
getlist
QueryDict.getlist(key, default)
以 Python 列表形式返回所请求的键的数据。 如果键不存在并且没有提供默认值,则返回空列表。
setlist
QueryDict.setlist(key, list_)
为给定的键设置 list_(与 setitem() 不同),可以设置一个多元素的列表。
appendlist
QueryDict.appendlist(key, item)
将项追加到内部与键相关联的列表中。
lists
QueryDict.lists()
类似 items,返回的列表中的每个元素,都是由键和对应的值列表组成的二元元组。
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[(u'a', [1, 2, 3])]
pop
QueryDict.pop(key)
返回给定键的值的 列表 ,并从字典中移除它们。如果键不存在,将引发 KeyError。
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
[u'1', u'2', u'3']
popitem
QueryDict.popitem()
删除字典 任意 一个成员(因为没有顺序的概念),并返回二值元组,包含键和键的所有值的列表。 在一个空的字典上调用时将引发 KeyError。
>>> q = QueryDict('a=1&a=2&b=3', mutable=True)
>>> q.popitem()
(u'a', [u'1', u'2'])
>>> q
dict
QueryDict.dict()
返回 QueryDict 的 dict 表示形式。
>>> q = QueryDict('a=1&a=2&b=3')
>>> q.dict()
{u'a': u'2', u'b': u'3'}
urlencode
QueryDict.urlencode([safe])
从数据中返回查询字符串格式。
>>> q = QueryDict('a=1&a=2&b=3')
q.urlencode()
u'a=1&a=2&b=3'
可选地,urlencode 可以传递不需要编码的字符。(这意味着要进行 url 编码)
>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode()
u'next=%2Fa%26b%2F'
>>> q.urlencode(safe='/')
u'next=/a%26b/'