首页 文章

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

提问于
浏览
54

在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 list

基本上我想做的就是这样

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!

2 回答

  • 1

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

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

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

    request.GET.getlist('myvar')
    

相关问题