处理Django request.GET和多个变量用于相同的参数名称

时间:2010-10-11 21:41:46

标签: django django-urls

在django视图等中,您可以访问 request.GET ['variablename'] ,因此在您的视图中,您可以返回如下内容:

myvar = request.GET['myvar']

实际的request.GET ['myvar']对象类型是:

<class 'django.http.QueryDict'>

现在,如果要为同一参数名传递多个变量,即

http://example.com/blah/?myvar=123&myvar=567

换句话说,您希望为参数 myvar

返回python 列表

基本上我想做的就是这样的事情

 for var in request.GET['myvar']:
     print var

但是,当你尝试只获得url中传递的最后一个值时,即上例中的 567

,shell中的结果将是:

5
6
7

然而,当你打印request.GET似乎有一个列表,如:

<QueryDict: {u'myvar': [u'123', u'567']}>

好的更新: 它旨在返回最后一个值,我的用例是我需要一个列表。

来自django docs:

  

的QueryDict。的的GetItem (键)   返回   给定键的值。如果   key有多个值,    getitem ()返回最后一个值。加薪   django.utils.datastructures.MultiValueDictKeyError   如果密钥不存在。 (这是一个   Python标准的子类   KeyError,所以你可以坚持捕捉   KeyError异常

     

QueryDict.getlist(key)返回   具有所请求密钥的数据,作为   Python列表。如果返回一个空列表   密钥不存在。这是有保证的   返回某种列表。

更新: 如果有人知道为什么django dev已经这样做了,请让我知道,显示一个列表似乎违反直觉,它不像一个行为。不是非常pythonic!

3 个答案:

答案 0 :(得分:145)

您需要GET对象的getlist()功能:

request.GET.getlist('myvar')

答案 1 :(得分:1)

另一个解决方案是创建请求对象的副本...通常,您不能遍历request.GET或request.POST对象,但您可以在副本上执行此类操作:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...

答案 2 :(得分:0)

当从 QueryDict 对象创建查询字符串时,该对象包含同一参数的多个值(例如一组复选框),请使用 urlencode() 方法:

例如,我需要获取传入的查询请求,删除一个参数并将更新后的查询字符串返回到结果页面。

# Obtain a mutable copy of the original string
original_query = request.GET.copy()

# remove an undesired parameter
if 'page' in original_query:
    del original_query['page']

现在,如果原始查询对同一个参数有多个值,如下所示: {...'track_id': ['1', '2'],...} 使用以下代码时,您将丢失查询字符串中的第一个元素:

new_query = urllib.parse.urlencode(original_query)

结果...

...&track_id=2&...

但是,可以使用 QueryDict 类的 urlencode 方法来正确包含多个值:

new_query = original_query.urlencode()

产生...

...&track_id=1&track_id=2&...