使用django.shortcuts.redirect添加request.GET变量

时间:2010-09-22 02:20:15

标签: django redirect django-urls django-views

可以在重定向中添加GET变量吗? (无需修改我的urls.py)

如果我redirect('url-name', x)

我得到HttpResponseRedirect('/my_long_url/%s/', x)

我没有使用HttpResponseRedirect('/my_long_url/%s/?q=something', x)投诉,只是想知道......

4 个答案:

答案 0 :(得分:101)

由于重定向只返回一个HttpResponseRedirect对象,您可以改变它:

response = redirect('url-name', x)
response['Location'] += '?your=querystring'
return response

答案 1 :(得分:42)

  

可以在重定向中添加GET变量吗? (无需修改我的urls.py)

我不知道如何在没有修改urls.py的情况下执行此操作

  

我没有抱怨使用HttpResponseRedirect('/ my_long_url /%s /?q = something',x)而只是想知道......

您可能希望编写一个瘦包装器以使其更容易。说,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)

然后可以从您的视图中调用它。例如,

return custom_redirect('url-name', x, q = 'something')
# Should redirect to '/my_long_url/x/?q=something'

答案 2 :(得分:1)

我们可以从Django导入urlencode。

from django.utils.http import urlencode

get_args_str = urlencode({'q': 'something'})

或者我们可以从启动请求中使用未解析的get parameters字符串

get_args_str = request.META['QUERY_STRING']

HttpResponseRedirect('%s?%s' % (url, get_args_str))

答案 3 :(得分:1)

我认为值得一提的是Django的RedirectView类具有内置的类属性query_string,可以将其覆盖或传递给as_view。如果设置为True,则query_string将在重定向中保留查询字符串。例如,您可以将以下内容放在urls.py中:

path('example-redirect/',
     RedirectView.as_view(url='https://example.com', query_string=True),
     name='example_redirect')