2019/12/08
Django【Django】パラメータを渡してリダイレクトさせる(redirect関数)
Djangoでリダイレクト処理を行う際に、URLパラメータを指定したい場合があります。
よくあるパターンとして、一度ログインページに遷移させるものの、まだユーザーアカウントを持っていないユーザーだった場合には、会員登録ページへ誘導する処理があります。
ログインページに遷移した段階では、前にいたページのパスなどをnext
などのパラメータで保持していますが、会員登録ページに遷移した際にそれらのパラメータは失われてしまいます。
そのような場合に、redirect処理に対してパラメータを付与する必要があります。
redirect関数を利用するときにパラメータを付与するには以下のような実装になります。
views.py
from django.urls import reverse
from urllib.parse import urlencode
# hoge_viewからhuga_viewにリダイレクトするときにパラメータを付与する
def hoge_view(request):
...
# リダイレクト先のパスを取得する
redirect_url = reverse('app:huga_view')
# パラメータのdictをurlencodeする。複数のパラメータを含めることも可能
parameters = urlencode({'param1': 'this_is_param1', 'param2': 123})
# URLにパラメータを付与する
url = f'{redirect_url}?{parameters}'
return redirect(url)
def huga_view(request):
param1 = request.GET.get('param1') # param1の値を取得
param2 = request.GET.get('param2') # param2の値を取得
...
return render(...)
reverse()関数は、urls.pyでView関数と紐づけた際に指定したname
などを指定することで、そのURLのパスを取得するものです。
この時点でベースのURLのパスは以下の状態です。
/hoge/
パラメータはdict型で複数指定することができ、それをurlencode()
関数でURL上でちゃんと使える形にエンコードしています。この変換によって、以下のようなパラメータが生成されます。
param1=this_is_param1¶m2=123
最後に、ベースのURLのパスとパラメータを?
で繋いでいます。
/hoge/?param1=this_is_param1¶m2=123
このパスを元に、redirect()
関数でリダイレクトをかけると、きちんとパラメータが付与された状態で次のページに遷移することができます。