【Django初学者向け】ページ名からURLを取得する「reverse」「reverse_lazy」違い、使い方を丁寧に解説!

Django

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

Django初学者の中で、

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

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

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

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

  • 役割
  • 違い
  • 使い方

を解説していきます

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

class NippoCreateFormView(FormView):
    template_name = "nippo/nippo-formclass.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って何?違いは?」から始めていきましょう!

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-formclass.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」を使ってクリエイトビューを作成する方法を解説します

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!
タイトルとURLをコピーしました