Django Logo

[Django]View のリダイレクト時にパラメータを追加する

DjangoView でリダイレクト処理を行う時に 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)

最後に連結した URLredirect() 関数の引数にセットしてリダイレクト処理を行います。

最後に

View のリダイレクト時にパラメータを追加することはあまりないと思いますが、いざという時のために知識としてきちんと理解しておきたいですね。

「[Django]View のリダイレクト時にパラメータを追加する」への1件のフィードバック

  1. ピンバック: SE-NOTEBOOK

SE-NOTEBOOK へ返信する 返信をキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です