(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の使い分け