Django
の View
でリダイレクト処理を行う時に URL
パラメータを追加したい時の実装方法を説明したいと思います。
前提条件
今回の動作検証環境は下記の通りです。
- Python : 3.6.2
- Django : 3.0.5
通常のリダイレクトについて
View
で普通にリダイレクトしたい場合、 redirect()
関数を使用して以下のように実装すればリダイレクトさせることができます。
return redirect('namespace:name')
こんな感じで urls.py
で定義した「 namespace
」と「 name
」を指定してあげればリダイレクトされます。
また、以下のようなルーティングの場合、
urls.py
path('/item/<int:pk>/', order_member_required(ItemDetailView.as_view()), name='item'),
このようにパラメータに主キーを追加してあげればリダイレクトできます。
views.py
return redirect('namespace:item', pk=pk)
ただ、この方法だと URL
のルーティングにパラメータを必ず定義しなければならず、 GET
リクエストの querystring
のように不定形なパラメータを受け渡しするのは難しいです。全てのパラメータのパターンを網羅できるルーティングを実装すれば実現することはできると思いますが、かなり複雑な実装になると思います。
どんな時にリダイレクト時にパラメータを追加したいか
以下のようなケースだと View
のリダイレクト時にパラメータを追加する必要性が出てくると思います。
- 検索画面で検索条件を入力後に検索ボタンをクリックし、
View
で入力チェックを行い一覧画面へリダイレクトさせる - 登録処理後に完了画面を表示する際に登録時の一部の情報のみを完了画面に受け渡したい
View のリダイレクト時にパラメータを追加する
では、実装方法を説明していきたいと思います。今回の処理に関係するところのみ抜粋しています。
redirect_url = reverse('namespace:name')
parameters = urlencode(dict(param_a=param_a,
param_b=param_b,
param_c=param_c))
url = f'{redirect_url}?{parameters}'
return redirect(url)
それでは一つずつ処理の説明をしていきたいと思います。
redirect_url = reverse('namespace:name')
まず、 reverse()
関数を使用してリダイレクト先の URL のパスを取得します。
parameters = urlencode(dict(param_a=param_a,
param_b=param_b,
param_c=param_c))
追加したいパラメータは dict
型で複数設定することができるので、それを urlencode()
関数を利用して URL
のパラメータとしてエンコードを行います。
url = f'{redirect_url}?{parameters}'
ベースの URL
のパスとエンコードしたパラメータを連結しています。
return redirect(url)
最後に連結した URL
を redirect()
関数の引数にセットしてリダイレクト処理を行います。
最後に
View
のリダイレクト時にパラメータを追加することはあまりないと思いますが、いざという時のために知識としてきちんと理解しておきたいですね。
コメント
[…] リダイレクト時にパラメータを追加する […]