(最終更新月: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ページも載せています。
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で覚えておくことは、
- どちらもインポート元は「django.urls」であること
- どちらもページ名からURLを取得するために使われること
- クラスベースビュー内の変数には、「reverse_lazy」を使うこと
の3点で充分かと思います
さて、現状ではFormViewとFormクラスを使ってクリエイトビューを作成しましたが、次回はよりモデルクラスとの連動に優れたフォームクラス「ModelForm」を使ってクリエイトビューを作成する方法を解説します