在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!
答案 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&...