メソッドベースのビューを使用する場合、reverse
を使用したリダイレクトはこれについて文句を言わず、ルートURL confを見つけることができます。しかし、クラスベースのビューでは、次のような不満があります。
ImproperlyConfigured at /blog/new-post/
The included urlconf 'blog.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.
私のクラスは次のように定義されています:
class BlogCreateView(generic.CreateView):
form_class = Blog
template_name = 'blog/new-post.html'
success_url = reverse('blog:list-post')
クラスベースのビューでsuccess_url
にreverse
を適切に使用する方法は?ありがとう。
PS:そして、このエラーの後にrunserver
を再起動する必要がある理由に興味があります(TemplateDoesNotExists
のような、runserver
)
ビューの実行時にreverse
が呼び出されるため、メソッドでreverse
を使用しても機能します。
def my_view(request):
url = reverse('blog:list-post')
...
get_success_url
をオーバーライドする場合、get_success_url
はビューの実行時にreverse
を呼び出すため、reverse
を引き続き使用できます。
class BlogCreateView(generic.CreateView):
...
def get_success_url(self):
return reverse('blog:list-post')
ただし、reverse
をsuccess_url
と共に使用することはできません。URLがロードされる前に、モジュールがインポートされるときにreverse
が呼び出されるためです。
get_success_url
のオーバーライドは1つのオプションですが、最も簡単な修正方法は、逆ではなく reverse_lazy
を使用することです。
from Django.urls import reverse_lazy
# from Django.core.urlresolvers import reverse_lazy # old import for Django < 1.10
class BlogCreateView(generic.CreateView):
...
success_url = reverse_lazy('blog:list-post')
Runserverの再起動に関する最後の質問に答えるために、ImproperlyConfigured
エラーはTemplateDoesNotExists
とは異なります。これは、Djangoアプリケーションがロードされるときに発生するためです。
reverse_lazy
CBVで reverse
の代わりに。 reverse
の遅延評価バージョンです。値が必要になるまで実行されません。
from Django.core.urlresolvers import reverse_lazy
class BlogCreateView(generic.CreateView):
form_class = Blog
template_name = 'blog/new-post.html'
success_url = reverse_lazy('blog:list-post')