UpdateViewやCreateViewで”No URL to redirect to. Either …”という例外が起きた時の対処法

UpdateViewやCreateViewを利用しているときに、次の様なImproperlyConfigured例外が発生する事があります。

ImproperlyConfigured: No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.

これはsuccess_urlが取得不可能だった場合に発生します。

今回はこの例外の発生原因と対処法を紹介します。

例外の発生原因

CreateViewやUpdateViewではオブジェクトの作成や更新処理が正常に完了した場合、任意のURLにリダイレクトします。

リダイレクト先の指定方法は2つあります。

  • ビュークラスにsuccess_url変数を定義する
  • モデルにget_absolute_urlメソッドを定義する

以下は、ビュークラスにsuccess_url変数を定義する例です。

from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
from django.contrib.auth.models import User


class UserCreateView(CreateView):
    model = User
    success_url = reverse_lazy('user-list')

以下は、モデルに定義するget_absolute_urlメソッドの例です。

インポート文に

from django.urls import reverse

を追加する必要があります。

def get_absolute_url(self):
    return reverse('user-detail', kwargs={'pk' : self.pk})

どちらも定義していない場合はImproperlyConfigured例外が発生します。

ImproperlyConfigured: No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.

(翻訳)
リダイレクト先のURLがありません。URLを定義するか、モデルにget_absolute_urlメソッドを定義してください。

優先順位

両方とも定義されている場合、success_urlの定義が優先されます。

対処法

以下の3つの対処法があります。

  • モデルにget_absolute_urlメソッドを定義する
  • ビュークラスにsuccess_url変数を定義する
  • get_success_urlメソッドをオーバーライドする

私は次の様に使い分けています。

1つ目の対処法は詳細画面にリダイレクトしたい時に使います。

2つ目の対処法は一覧画面にリダイレクトしたい時に使います。

3つ目の対処法は主にリダイレクト先を動的に変更したい場合に使います。

スポンサーリンク
スポンサーリンク