NARITO BLOG

Django、リダイレクト時にGETパラメータも渡す

Python, Django,

概要

Djangoでリダイレクト処理を行うことはよくありますが、GETパラメーターを引き継いでリダイレクトさせたいという場合があります。

GETパラメーターを引き継いだリダイレクト

GETパラメーターも一緒にリダイレクトさせるには、次のようにします。

from django.shortcuts import resolve_url, redirect
...
...
url = resolve_url('app:post_list')
get_params = request.GET.urlencode()
url += '?' + get_params
return redirect(url)

resove_url()app:post_listのような文字列を渡すと、それのURLを作成してくれます。

url = resolve_url('app:post_list')
# /post_list のようなURLができる。

request.GET.urlencode()で、GETパラメーターの文字列を取得できます。

get_params = request.GET.urlencode()
# 例えば a=1&b=2 のように取得できる

作成したURLに'?' + get_paramsを足すことで、URLに送信されたGETパラメーターを付けています。

url += '?' + get_params
# /post_list?a=1&b=2 のようなURLになる。

忘れがちですが、redirect()関数はapp:post_listのような文字列だけでなく、URLを表す文字列も直接渡せます。

return redirect(url)

他の方法

少し難しいですが、次のように書くこともできます。

response = redirect('app:post_list')
get_params = request.GET.urlencode()
response['location'] += '?'+get_params
return response

redirect()render()関数等と同様に、HttpResponseオブジェクトを作成します(正確には、redirectが返すのはHttpResponseRedirectオブジェクト)。

このオブジェクトはHTTPレスポンスを表現したオブジェクトで、ビューが最終的に返すべきオブジェクトです。

よく誤解されがちですが、reverse()reverse_lazy()resolve_url()はURLを作成する関数です。redirect()render()とは役割が違うので注意しましょう。

上のコードは先にHTTPレスポンスオブジェクトを作成し、その中身...リダイレクト先URLを表すresponse['location']にGETパラメータを加えた後、returnしています。