Reverse for success_url на Django Class Based View жалуется на круговой импорт
При использовании метода на основе представления перенаправление с помощью reverse
не жаловалось на это и все еще может найти корневой URL-адрес. Но в представлениях на основе класса он жалуется:
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')
Как правильно использовать reverse
для success_url
в классах? Спасибо.
PS: И меня интересует, почему после этой ошибки нужно перезапустить runserver
(не похоже на ошибку типа TemplateDoesNotExists
, которая не нуждается в перезапуске runserver
)
Ответы
Ответ 1
Использование reverse
в вашем методе работает, потому что при запуске представления вызывается reverse
.
def my_view(request):
url = reverse('blog:list-post')
...
Если вы переопределяете get_success_url
, вы все равно можете использовать reverse
, потому что get_success_url
вызывает reverse
при запуске представления.
class BlogCreateView(generic.CreateView):
...
def get_success_url(self):
return reverse('blog:list-post')
Однако вы не можете использовать reverse
с success_url
, так как тогда reverse
вызывается, когда модуль импортируется, прежде чем загружаются URL-адреса.
Переопределение get_success_url
является одним из вариантов, но самым простым решением является использование 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')
Чтобы ответить на ваш последний вопрос о перезапуске сервера, ошибка ImproperlyConfigured
отличается от TemplateDoesNotExists
, поскольку она возникает при загрузке приложения Django.
Ответ 2
Попробуйте использовать reverse_lazy
вместо reverse
в вашем CBV. Его лениво оцененная версия 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')