【问题标题】:How to redirect with a get parameter in django view?如何在 django 视图中使用 get 参数进行重定向?
【发布时间】:2019-05-04 08:40:09
【问题描述】:

我想在 django 视图中使用 GET 参数进行重定向。由于某些原因,我想使用 GET 参数,而不是 url 参数。

def product_new(request):
    group = request.GET.get('group')
    if group == None:
        product = Product.objects.create()
        return redirect('cms:product_list_edit')
    else:
        product = Product.objects.create(group=group)
        rreturn redirect('cms:product_list_edit') # I want to redirect this url with GET parameter.

【问题讨论】:

    标签: django redirect parameters get


    【解决方案1】:

    python3 及以上版本:

    def redirect_with_params(viewname, **kwargs):
        """
        Redirect a view with params
        """
        rev = reverse(viewname)
    
        params = urllib.parse.urlencode(kwargs)
        if params:
            rev = '{}?{}'.format(rev, params)
    
        return HttpResponseRedirect(rev)
    

    使用:

    redirect_with_params('main-domain:index', param1='value1', param2='value2')
    

    【讨论】:

    • 太棒了!谢谢!
    【解决方案2】:

    据我所知,Django 没有向 URL 添加查询字符串的工具,但这本身不是问题,因为我们可以创建自己的函数,例如:

    from django.urls import reverse
    from django.http.response import HttpResponseRedirect
    
    def redirect_qd(viewname, *args, qd=None, **kwargs):
        rev = reverse(viewname, *args, **kwargs)
        if qd:
            rev = '{}?{}'.format(rev, qd.urlencode())
        return HttpResponseRedirect(rev)

    对值进行编码很重要。想象一下,您的 group 具有 foo&bar=3 的值。如果您没有正确编码,那么这意味着您的查询字符串稍后将被解析为两个参数:groupbar 其中groupfoobar 是@ 987654329@。因此,这不是您想要的。通过使用urlencode,它将产生'group=foo%26bar%3D3',这就是预期的值。

    然后我们可以像这样使用这个函数:

    from django.http.request import QueryDict
    
    def product_new(request):
        group = request.GET.get('group')
        if group == None:
            product = Product.objects.create()
            return redirect('cms:product_list_edit')
        else:
            product = Product.objects.create(group=group)
            qd = QueryDict(mutable=True)
            qd.update(group=group)
            return redirect_qd('cms:product_list_edit', qd=qd)

    如果您只是想传递整个查询字符串,则可以使用redirect_qd('myview', request.GET) 调用它。

    【讨论】:

      【解决方案3】:

      我找到了我想要的答案。

      def product_new(request):
          group = request.GET.get('group')
          if group == None:
              product = Product.objects.create()
              return redirect('cms:product_list_edit')
          else:
              product = Product.objects.create(group=group)
              response = redirect('cms:product_list_edit')
              response['Location'] += '?group=' + group
              return response
      

      【讨论】:

      • 请不要那样做。如果group 包含例如&,您将破坏编码。您需要正确转义这些值。
      • 该组永远不会包含&。谢谢!
      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多