web-dev-qa-db-ja.com

Django.shortcuts.redirectを使用してrequest.GET変数を追加する

リダイレクトにGET変数を追加することはできますか? (私のurls.pyを変更する必要はありません)

もし私がやればredirect('url-name', x)

HttpResponseRedirect('/my_long_url/%s/', x)

代わりにHttpResponseRedirect('/my_long_url/%s/?q=something', x)を使用しても問題はありませんが、疑問に思っています...

48
juanefren

リダイレクトに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'
42
Manoj Govindan

リダイレクトはHttpResponseRedirectオブジェクトを返すだけなので、次のように変更できます。

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

Djangoからurlencodeをインポートできます。

from Django.utils.http import urlencode

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

または、リクエストを開始してから、解析されていないパラメータ文字列を使用することもできます

get_args_str = request.META['QUERY_STRING']

HttpResponseRedirect('%s?%s' % (url, get_args_str))
1
Valery Ramusik

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')
1
Alex