2015-07-07 14 views
11

Podczas korzystania z widoku opartego na metodach, przekierowanie z reverse nie narzeka na to i nadal może znaleźć adres URL roota. Ale, poglądów opartych na klasach, to narzekają:Odwróć dla success_url na widoku klasy Django narzekaj na okrągły 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. 

Moja klasa jest zdefiniowana następująco:

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

Jak prawidłowo używać reverse dla success_url w widokach opartych na klasach? Dzięki.

PS: I jestem zainteresowany dlaczego jest konieczne ponowne uruchomienie runserver po tym błędzie (nie jak błąd jak TemplateDoesNotExists który ma potrzeby, aby ponownie uruchomić runserver)

Odpowiedz

29

Korzystanie reverse w sposobie działa, ponieważ reverse jest wywoływana, gdy widok jest uruchamiany.

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

Jeśli Zignorować get_success_url, to nadal można używać reverse, ponieważ get_success_url rozmowy reverse gdy widok jest prowadzony.

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

Jednak nie można używać reverse z success_url, bo wtedy reverse jest wywoływana, gdy moduł jest importowany, zanim adresy URL zostały załadowane.

Przesłanianie get_success_url jest jedną z opcji, ale najłatwiejszą metodą jest użycie reverse_lazy zamiast odwrócenia.

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

Aby odpowiedzieć na to ostatnie pytanie o ponownym runserver, błąd ImproperlyConfigured różni się od TemplateDoesNotExists ponieważ występuje wtedy, gdy aplikacja Django jest załadowany.

+0

FYI. Z Django 2.0. Import dla 'reverse_lazy' jest teraz' od django.urls import reverse_lazy' – Chad

+0

@chad dzięki, zaktualizowałem import – Alasdair

6

Spróbuj użyć reverse_lazy zamiast reverse w swoim CBV. Jest to leniwie oceniana wersja reverse. Nie zostanie wykonane, dopóki wartość nie będzie potrzebna.

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') 
Powiązane problemy