7

从 request.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'...)
4

3 回答 3

12

这应该有效:

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

params = urllib.urlencode(get)
于 2012-08-31T02:09:13.133 回答
2

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

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

params = urllib.urlencode(cp)
于 2012-08-31T02:20:39.963 回答
1

所有这些答案几乎都是正确的,但是对于存在多个具有相同键名的参数的边缘情况失败了,这是有效的(以及 django 使用 aQueryDict而不是 a的全部原因dict)。如果使用 urlliburlencode会丢失多余的参数,需要使用QueryDict.

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()
于 2013-10-22T15:42:13.963 回答