ソフトウェア開発 プログラミング

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

ソフトウェア開発
この記事は約3分で読めます。
スポンサーリンク

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

スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました