Django,从request.GET中排除参数

7

如何从请求的GET参数中排除特定参数?

例如,给定一个url参数?a=a&b=b&c=c,我想要去掉参数b,生成的url参数是?a=a&c=c,但不改变request.GET

目前我正在循环遍历键来删除b

params = {}
for key,value in request.GET.items():
  if not key == 'b':
    params[key] = value

url = urllib.urlencode(params)

我在想是否有更好、更优雅的方法来达到相同的结果?例如:

request.GET.urlencode(exclude=['b',])

甚至更好的是这样

urllib.urlencode(request.GET.exclude('b'...)
3个回答

12

这样应该可以工作:

get = request.GET.copy()
del get['b']

params = urllib.urlencode(get)

很好,我也考虑过使用这种方法,但由于无法控制的参数,我需要将其包装在try和catch块中。 - James Lin
如果你想避免使用try/catch,可以使用我的方法,像这样:x = cp.pop('b', None),然后检查:if x is not None: ... - thikonom
如果您有多个相同名称的GET参数,例如?a=1&a=2&b=3&c=4,则此方法无法正常工作。 - dalore
这很棒!在最后一行,get.urlencode() 就足够了。 - Ajoy

2

您不能直接操作request.GET,因为它是一个不可变的QueryDict。所以需要创建一个浅拷贝,然后删除所需的键。

cp = request.GET.copy()
cp.pop('b')

params = urllib.urlencode(cp)

1
所有这些答案几乎都正确,但在存在具有相同键名的多个参数的边缘情况下失败了,这是有效的(也是Django使用QueryDict而不是dict的整个原因)。如果您使用urllib的urlencode,它将丢失额外的参数,您需要使用QueryDict提供的urlencode。

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict

QueryDict是一种类似于字典的类,专门处理同一个键有多个值的情况。这是必要的,因为有些HTML表单元素,特别是<select multiple="multiple">,会传递同一个键的多个值。

因此,正确的方式是:

querydict = request.GET.copy()
if 'b' in querydict:
    del querydict['b']
return querydict.urlencode()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接