In an HttpRequest
object, the GET
and POST
attributes are instances of django.http.QueryDict
, a dictionary-like class customized to deal with multiple values for the same key. This is necessary because some HTML form elements, notably <select multiple>
, pass multiple values for the same key.
The QueryDict
s at request.POST
and request.GET
will be immutable when accessed in a normal request/response cycle. To get a mutable version you need to use .copy()
.
QueryDict
implements all the standard dictionary methods because it's a subclass of dictionary, with the following exceptions.
QueryDict.__init__()
Instantiates a QueryDict
object based on query_string
.
>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
If query_string
is not passed in, the resulting QueryDict
will be empty (it will have no keys or values).
Most QueryDict
s you encounter, and in particular those at request.POST
and request.GET
, will be immutable. If you are instantiating one yourself, you can make it mutable by passing mutable=True
to its __init__()
.
Strings for setting both keys and values will be converted from encoding
to Unicode. If encoding is not set, it defaults to DEFAULT_CHARSET
.
QueryDict.__getitem__(key)
Returns the value for the given key. If the key has more than one value, __getitem__()
returns the last value. Raises django.utils.datastructures.MultiValueDictKeyError
if the key does not exist.
QueryDict.__setitem__(key, value)
Sets the given key to [value]
(a Python list whose single element is value
). Note that this, as other dictionary functions that have side effects, can only be called on a mutable QueryDict
(such as one that was created via copy()
).
QueryDict.__contains__(key)
Returns True
if the given key is set. This lets you do, for example, if "foo" in request.GET
.
QueryDict.get(key, default)
Uses the same logic as __getitem__()
above, with a hook for returning a default value if the key doesn't exist.
QueryDict.setdefault(key, default)
Just like the standard dictionary setdefault()
method, except it uses __setitem__()
internally.
QueryDict.update(other_dict)
Takes either a QueryDict
or standard dictionary. Just like the standard dictionary update()
method, except it appends to the current dictionary items rather than replacing them. For example:
>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
['2']
QueryDict.items()
Just like the standard dictionary items()
method, except this uses the same last-value logic as __getitem__()
. For example:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[('a', '3')]
QueryDict.iteritems()
Just like the standard dictionary iteritems()
method. Like QueryDict.items()
this uses the same last-value logic as QueryDict.__getitem__()
.
QueryDict.iterlists()
Like QueryDict.iteritems()
except it includes all values, as a list, for each member of the dictionary.
QueryDict.values()
Just like the standard dictionary values()
method, except this uses the same last-value logic as __getitem__()
. For example:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']
QueryDict.itervalues()
Just like QueryDict.values()
, except an iterator.
In addition, QueryDict
has the following methods:
QueryDict.copy()
Returns a copy of the object, using copy.deepcopy()
from the Python standard library. This copy will be mutable even if the original was not.
QueryDict.getlist(key, default)
Returns the data with the requested key, as a Python list. Returns an empty list if the key doesn't exist and no default value was provided. It's guaranteed to return a list of some sort unless the default value was no list.
QueryDict.setlist(key, list)
Sets the given key to list_
(unlike __setitem__()
).
QueryDict.appendlist(key, item)
Appends an item to the internal list associated with key.
QueryDict.setlistdefault(key, default_list)
Just like setdefault
, except it takes a list of values instead of a single value.
QueryDict.lists()
Like items()
, except it includes all values, as a list, for each member of the dictionary. For example:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]
QueryDict.pop(key)
Returns a list of values for the given key and removes them from the dictionary. Raises KeyError
if the key does not exist. For example:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
['1', '2', '3']
QueryDict.popitem()
Removes an arbitrary member of the dictionary (since there's no concept of ordering), and returns a two value tuple containing the key and a list of all values for the key. Raises KeyError
when called on an empty dictionary. For example:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
QueryDict.dict()
Returns dict
representation of QueryDict
. For every (key, list) pair in QueryDict
, dict
will have (key, item), where item is one element of the list, using same logic as QueryDict.__getitem__()
:
>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{'a': '5'}
QueryDict.urlencode([safe])
Returns a string of the data in query-string format. Example:
>>> q = QueryDict('a=2&b=3&b=5')
>>> q.urlencode()
'a=2&b=3&b=5'
Optionally, urlencode can be passed characters which do not require encoding. For example:
>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode(safe='/')
'next=/a%26b/'