DjangoBrothers BLOG ✍️

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&param2=123

最後に、ベースのURLのパスとパラメータを?で繋いでいます。

/hoge/?param1=this_is_param1&param2=123

このパスを元に、redirect()関数でリダイレクトをかけると、きちんとパラメータが付与された状態で次のページに遷移することができます。