【问题标题】:Django, exclude parameters from request.GETDjango,从request.GET中排除参数
【发布时间】:2025-11-26 00:05:02
【问题描述】:

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

【问题讨论】:

    标签: django url parameters request


    【解决方案1】:

    这应该有效:

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

    【讨论】:

    • 很好,我也考虑过使用这种方法,但是由于参数不可控,我需要用 try 和 catch 块来包装它。
    • 如果你想避免 try/catch 使用我的方法,如下所示:x = cp.pop('b', None) 然后检查:如果 x 不是 None:...
    • 如果您有多个同名的 get 参数,这将不起作用。例如 ?a=1&a=2&b=3&c=4
    • 这太棒了!在最后一行 get.urlencode() 就足够了
    【解决方案2】:

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

    cp = request.GET.copy()
    cp.pop('b')
    
    params = urllib.urlencode(cp)
    

    【讨论】:

      【解决方案3】:

      所有这些答案几乎都是正确的,但是对于有多个具有相同键名的参数的边缘情况失败了,这是有效的(以及 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()
      

      【讨论】: