如何在Django中为同一参数使用多个变量处理request.GET


82

在Django视图中,您可以访问request.GET['variablename'],因此在视图中您可以执行以下操作:

myvar = request.GET['myvar']

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

<class 'django.http.QueryDict'>

现在,如果要传递具有相同参数名称的多个变量,即:

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

您想要list为参数返回python myvar,然后执行以下操作:

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

但是,当您尝试仅获得url中传递的最后一个值时,即在上面的示例中,您将获得567,而在shell中的结果将是:

5
6
7

但是,当您打印request.GET它时,它似乎带有一个listie:

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

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

来自Django文档:

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

QueryDict.getlist(key)以Python列表形式返回带有请求的键的数据。如果键不存在,则返回一个空列表。保证返回某种列表。

更新:如果有人知道django开发人员为什么要这样做,请告诉我,显示列表似乎违反直觉,并且它的行为不像一个。不是很pythonic!


4
我认为原因是您应该知道是期望列表还是单个值。QueryDict.getitem有时不应返回列表,而在其他时候则不返回单个项目-那么每个人都将总是必须检查其返回类型才能正确处理它。
jgiles 2013年

Answers:


180

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

request.GET.getlist('myvar')

10
如果使用jquery将项目发回,则可能需要在var名称的末尾添加“ []”。
Danny Staple

2
我知道getlist,但是“ []”让我失望。另外,我有一个朋友叫安迪·斯台普(Andy Staple),有一秒钟我以为他对Django的了解比我想象的要多得多。那也把我扔了。
kungphu

1
这需要在所有Django文档,Django Rest Framework文档中张贴,并在我的额头上向后贴。这确实让我措手不及
安东尼·曼宁·富兰克林

似乎Django有点丢球了,不确定是否
要这样做

1

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

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

2
你确定吗?这根本不会改变QueryDict的行为。我只是得到另一个具有相同“限制”的QueryDict
坚果
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.