处理Django request.GET和多个variables为相同的参数名称

在Django视图等你可以访问request.GET ['variablename'] ,所以在你的观点,你可以返回做这样的事情:

myvar = request.GET['myvar'] 

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

 <class 'django.http.QueryDict'> 

现在,如果你想传递相同的参数名称,即多个variables

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文档:

的QueryDict。 getitem (key)返回给定键的值。 如果键值不止一个, getitem ()返回最后一个值。 如果键不存在,则引发django.utils.datastructures.MultiValueDictKeyError。 (这是Python的标准KeyError的一个子类,所以你可以坚持捕获KeyError

QueryDict.getlist(key)以Python列表的forms返回包含请求键的数据。 如果键不存在,则返回空列表。 保证返回某种列表。

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

你需要GET对象的getlist()函数:

 request.GET.getlist('myvar') 

另一个解决scheme是创build请求对象的副本…通常,您不能遍历request.GET或request.POST对象,但是您可以在副本上执行这样的操作:

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