Django:redirect関数の違いについてまとめてみた

Django:redirect関数の違いについてまとめてみた

下の違いは何なんだろうと思ったので調べてまとめてみました。

  1. reverse_lazy
  2. render
  3. redirect
  4. HttpResponseRedirect
  5. reverse

reverse_lazy の使いどころ

PresetClass(汎用ビュー)の説明があると必ず目にします。

success_url = reverse_lazy("Hoge:hoge_list")

こんな感じで記載しますが、意味するところは【 遅延実行版 reverse 】との事です。

ページ遷移に絶対必要なパーツに『urls.py』があります。
このurls.py はクラス変数を設定する段階では読み込まれないのだそうです。
つまり、class~~と書き出す汎用ビューを利用している場合そのクラス内では読み込まれないと言う事になります。
そのため、urls.pyを読み込んだら実行するようにする命令がreverse_lazyになるのだそうです。

reverse_lazyの問題点は引数を伝えられない事にあります。

render の使いどころ

関数ビュー(def ~~)を使っている場合一番目にするのがrenderです。

return render(request, 'hoge_list.html', params)

『render = 描写』 なので「renderで渡された値を使ってページを描写するよ」と言う事です。

引数で渡している request には userなどの情報も含まれているのでTemplate.htmlで {{ user }}とすれば簡単に呼び出せます。第二因子にTemplate.htmlを、第三因子にTemplateに渡す引数をまとめた配列(リスト)を記載します

paramsの後にもう一因子の引数を加えるとHTMLがレンダリングされずテキストとして出力されます。

また「引数を使って描写するのだから順番は不問では?」と思い実験してみた所、500番のエラーが出てきました。

順番は変えず上記構成を覚えてしまうことが必要です。

redirect の使いどころ

どこかのページへ飛ばす時に使います。

return redirect(to='/hoge/1/')

renderとの違いはコードの書いてある時点で描写をせず、指定の場所を読み込みなおす点です。

例えば、下のようなコードがあった時。POSTがあった場合はSaveしてもう一度自身(hoge/pk/detail)を読み込みます。そして、読み込みなおした時にはPOSTの値はなくなっているため、if文はスキップされrenderが実行されます。

def HogeDetailView(request,pk):
    object = CustomUser.objects.get(pk=pk)
    if (request.method == 'POST'):
        Recode = HogeCreateForm(request.POST, instance=object)
        Recode.save()
        messages.success(request, 'レコードを更新しました。')
        url = '/hoge/'+ pk + '/detail'
        return redirect(to=url)
    params = {
        'object': object
    }
    return render(request, 'CRUD/User_detail.html', params)

HttpResponseRedirect の使いどころ

基本はredirectと同じですが、大きな違いが1点あります。

アプリを超えてredirectできる。

私が実際に活用している個所はログアウト処理です。

return HttpResponseRedirect('/logout')

こんな感じで書きます。
ログインログアウトに関しては、基本的にWEBサイト表側の造作に組み込まれます。
で、ログイン後の処理を同じ表側に記載していけば終始redirectのみで処理できるのですが、ログイン後のページを別アプリとして組み立てた場合、ログアウト用のページはアプリケーションをまたがないといけません。

この場合、redirectではurlがないと怒られます。理由は[ app/logout ]にアクセスしてしまうからです。

HttpResponseRedirectではhttpsから始まるURLをそのまま記載することもできるので便利です。

reverse の使いどころ

私は一番利用の少ないコードです。

名前からurlを呼び出すときに使うと言う事で、urls.pyに記載したnameを参照して読込むページを指示します。

reverse ('Hoge:top')
reverse vies.HogeListView

redirectがJUMP先にpageURLを直接指定するのに対し、reverseはURLを作っているviewを指定したりurls.pyに登録したnameを指定してJUMP先を指示します。

合わせ技もある

return HttpResponseRedirect(reverse('form_page', args=request))

例はHttpResponseRedirectとreverseとの組み合わせ例です。
HttpResponseRedirectではurlを直接指示する必要がありますが、reverseをかませることでnameでの指示が可能になります。

まとめ

超簡単にではありますが、ざっとまとめてみました。

主だって使うのはrenderとredirect。で、時々HttpResponseRedirectという感じかな。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください