ちゃぱブログ / エンジニアリング / マネジメント

とあるプロダクトの運用組織のマネジメントしてる人の雑記。主にエンジニアリングやマネジメントのことを書きます。ときおりプチ情報も

(Django備忘)render、reverse、reverse_lazyの違いを簡単にまとめておく

概要

Djangoのrender、reverse、reverse_lazyってよく使うけど、それぞれどんな用途のものなのだ?をまとめた自分用のメモ。 よくわからず使ってたのだけど、調べてみると、そもそも並べて比較する対象ではなかった。

雑な 結論

コマンド 分類 概要
render HttpResponseを返すもの 単純なテンプレートとしてHttpResponseをreturnするときのショートカット
reverse URLの解決 url.pyで決めた名前を解析する関数
reverse_lazy URLの解決 reverseをクラスベースビューのクラス変数として書くときに利用

少し詳細

render

こちらのリンク先に、

テンプレートをロードしてコンテキストに値を入れ、テンプレートをレンダリングした結果を HttpResponse オブジェクトで返す、というイディオムは非常によく使われます。 Django はこのためのショートカットを提供します

とある。 ベーシックにテンプレートを返すときに利用する。なので、リダイレクトさせたいときは別。(redirectを利用する)

reverse、reverse_lazy

「URLを解決する」という点は同じ。ただ、クラス変数の定義の際には、まだurls.pyが動いていないので名前が定義されていない。それを解決するために、遅延関数としてreverse_lazyを用意している。 つまり、クラスベースビューなどで、

class HogeCreateView(CreateView):
    success_url = reverse_lazy(‘app:index’)

といったときに、reverse_lazyを使う。 関数の中でURLを解決したいときは reverse で良い。

renderと本来比較すべき子たち

Djangoのショートカット 本来は上のページにあるような、redirectとかを比較対象とすべき。ほんと何もわかってなかったなー。反省。

参考にさせていただいた記事

[Django] success_urlとget_success_urlおよびreverseとreverse_lazyの使い分け