Django,从request.GET中排除参数

时间:2012-08-31 01:59:06

标签: django url parameters request

从request.GET中排除参数的最佳方法是什么?

例如,给定一个网址参数?a=a&b=b&c=c并且我想取出参数b来生成?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 个答案:

答案 0 :(得分:9)

这应该有效:

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

params = urllib.urlencode(get)

答案 1 :(得分:2)

您无法直接操纵request.GET,因为它是不可变的QueryDict。 因此,制作浅色副本,然后删除所需的密钥。

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

params = urllib.urlencode(cp)

答案 2 :(得分:0)

所有这些答案几乎都是正确的,但是对于具有相同键名的多个参数的边缘情况失败,这是有效的(并且django使用QueryDict而不是{{的全部原因1}})。如果你使用urllib的dict它会丢失额外的参数,你需要使用urlencode提供的urlencode。

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

  

QueryDict是一个类似字典的类,用于处理多个   同一个键的值。这是必要的,因为有些HTML表单   元素,尤其是QueryDict,传递多个值   对于同一把钥匙。

所以正确的方法是:

<select multiple="multiple">