add request.GET variable using django.shortcuts.redirect

前端 未结 4 1986
北荒
北荒 2020-12-04 19:14

Is possible to add GET variables in a redirect ? (Without having to modifiy my urls.py)

If I do redirect(\'url-name\', x)

I get HttpRespo

相关标签:
4条回答
  • 2020-12-04 19:34

    We can import urlencode from django.

    from django.utils.http import urlencode
    
    get_args_str = urlencode({'q': 'something'})
    

    Or we can just use unparsed get parameters string from starting request

    get_args_str = request.META['QUERY_STRING']
    
    HttpResponseRedirect('%s?%s' % (url, get_args_str))
    
    0 讨论(0)
  • 2020-12-04 19:36

    I think it's worth noting that Django's RedirectView class has a built-in class attribute query_string which can be overridden or passed to as_view. If set to True, query_string will preserve the query string in the redirect. For example, you could put the following in urls.py:

    path('example-redirect/',
         RedirectView.as_view(url='https://example.com', query_string=True),
         name='example_redirect')
    
    0 讨论(0)
  • 2020-12-04 19:43

    Since redirect just returns an HttpResponseRedirect object, you could just alter that:

    response = redirect('url-name', x)
    response['Location'] += '?your=querystring'
    return response
    
    0 讨论(0)
  • 2020-12-04 19:46

    Is possible to add GET variables in a redirect ? (Without having to modifiy my urls.py)

    I don't know of any way to do this without modifying the urls.py.

    I don't have complains using HttpResponseRedirect('/my_long_url/%s/?q=something', x) instead, but just wondering...

    You might want to write a thin wrapper to make this easier. Say, custom_redirect

    def custom_redirect(url_name, *args, **kwargs):
        from django.core.urlresolvers import reverse 
        import urllib
        url = reverse(url_name, args = args)
        params = urllib.urlencode(kwargs)
        return HttpResponseRedirect(url + "?%s" % params)
    

    This can then be called from your views. For e.g.

    return custom_redirect('url-name', x, q = 'something')
    # Should redirect to '/my_long_url/x/?q=something'
    
    0 讨论(0)
提交回复
热议问题