【Django】reverse_lazyの使いどころ|reverseとの違い

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2021年12月)

Django初学者の中で、

「URLを取得したいけど、ページ名から取得するにはどうするの?」

「reverseとreverse_lazyってあるけど、違いは何なの?」

という疑問をお持ちの方も多いのではないでしょうか?

当記事では、ページ名からURLを取得できる「reverse」と「reverse_lazy」について

  • 役割
  • 違い
  • 使い方

を解説していきます

別記事にて作成したフォームビュークラスのsuccess_urlを書き換えながら解説をしていきます

class NippoCreateFormView(FormView):
    template_name = "nippo/nippo-form.html"
    form_class = NippoFormClass
    success_url = "/nippo/"

    def form_valid(self, form):
        data = form.cleaned_data
        obj = NippoModel(**data)
        obj.save()
        return super().form_valid(form)

まずは、「reverse、reverse_lazyって何?違いは?」から始めていきましょう!

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

reverse、reverse_lazyとは?

2つとも役割は同じで、どちらも

ページ名からURLを取得するためのメソッド

になります

違い・使い分けについては、これだけ覚えておきましょう

クラスベースビュー内の変数には「reverse_lazy」を使う

仮に、上記で紹介したコード内「success_url」にreverse(ページ名)を与えるとどうなるか見てみると、

django.core.exceptions.ImproperlyConfigured: The included URLconf 'main.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

サーバーを立ち上げた途端、エラーとなってしまいました

どうやら変数の読み込みは最初に行われるので、DjangoがURLファイルをすべて読み込む前に実行されるためエラーとなってしまうようです

つまり、通常の関数内で使う文にはどちらも機能しますが、クラスベースビューの変数へURLを格納したい場合は、「reverse_lazy」を使いましょう!

【実例】日報アプリ「NippoCreateFormView」クラス

実際のコードを見ていきましょう!

【views.py】

from django.urls import reverse, reverse_lazy

class NippoCreateFormView(FormView):
    template_name = "nippo/nippo-form.html"
    form_class = NippoFormClass
    success_url = reverse_lazy("nippo-list")

    def form_valid(self, form):
        data = form.cleaned_data
        obj = NippoModel(**data)
        obj.save()
        return super().form_valid(form)

もしくは、get_success_url関数内に記述する場合は、「reverse」でも問題なく動作します

def get_success_url(self):
    return reverse("nippo-list")

まとめ

reverseとreverse_lazyで覚えておくことは、

  1. どちらもインポート元は「django.urls」であること
  2. どちらもページ名からURLを取得するために使われること
  3. クラスベースビュー内の変数には、「reverse_lazy」を使うこと

の3点で充分かと思います

さて、現状ではFormViewとFormクラスを使ってクリエイトビューを作成しましたが、次回はよりモデルクラスとの連動に優れたフォームクラス「ModelForm」を使ってクリエイトビューを作成する方法を解説します

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