Подтвердить что ты не робот

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)

4b9b3361

Ответ 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')