2015-07-07 5 views
11

Bei der Verwendung der methodenbasierten Ansicht, Umleitung mit reverse hat nicht darüber beschweren und kann immer noch die Root-URL conf. Aber in klassenbasierten Ansichten, sie klagen:Reverse für success_url auf Django Klassenbasierte Ansicht klagen über zirkulären Import

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. 

Meine Klasse ist definiert wie folgt aus:

class BlogCreateView(generic.CreateView): 
    form_class = Blog 
    template_name = 'blog/new-post.html' 
    success_url = reverse('blog:list-post') 

Wie man richtig verwenden reverse für success_url in klassenbasierten Ansichten? Vielen Dank.

PS: Und ich bin interessiert, warum es brauchen ist runserver nach diesem Fehler neu zu starten (nicht einen Fehler wie TemplateDoesNotExists mögen, das keine Notwendigkeit runserver neu zu starten ist)

Antwort

29

reverse in Ihrer Methode verwenden funktioniert, weil reverse wird aufgerufen, wenn die Ansicht ausgeführt wird.

def my_view(request): 
    url = reverse('blog:list-post') 
    ... 

Wenn Sie get_success_url overrride, dann können Sie immer noch reverse verwenden, da get_success_url Anrufe reverse, wenn die Ansicht ausgeführt wird.

class BlogCreateView(generic.CreateView): 
    ... 
    def get_success_url(self): 
     return reverse('blog:list-post') 

Sie können jedoch nicht reverse mit success_url, verwenden, weil dann reverse aufgerufen wird, wenn das Modul importiert wird, bevor die Urls geladen wurden.

Überschreiben get_success_url ist eine Option, aber die einfachste Lösung ist reverse_lazy anstelle von Reverse zu verwenden.

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') 

Um Ihre letzte Frage zu dem Neustart runserver zu beantworten, die ImproperlyConfigured Fehler unterscheidet sich von TemplateDoesNotExists weil es auftritt, wenn die Django-Anwendung geladen wird.

+0

FYI. Mit Django 2.0. Der Import für 'reverse_lazy' ist jetzt' von django.urls Import reverse_lazy' – Chad

+0

@ chad danke, ich habe den Import aktualisiert – Alasdair

6

Verwenden Sie reverse_lazy anstelle von reverse in Ihrem CBV. Es ist eine faul ausgewertete Version von reverse. Es wird nicht ausgeführt, bis der Wert benötigt wird.

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') 
Verwandte Themen