web-dev-qa-db-ja.com

Djangoクラスベースビューが循環インポートについて文句を言う

メソッドベースのビューを使用する場合、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_urlreverseを適切に使用する方法は?ありがとう。

PS:そして、このエラーの後にrunserverを再起動する必要がある理由に興味があります(TemplateDoesNotExistsのような、runserver

19
Mas Bagol

ビューの実行時に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')

ただし、reversesuccess_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アプリケーションがロードされるときに発生するためです。

47
Alasdair

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')
8
Rahul Gupta