对基于Django Class Based View的success_url的反向抱怨循环导入

时间:2015-07-07 17:33:26

标签: django redirect django-views

使用基于方法的视图时,使用reverse重定向并没有抱怨此问题,仍然可以找到根网址。但是,在基于阶级的观点中,它抱怨:

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

2 个答案:

答案 0 :(得分:44)

在您的方法中使用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')

但是,您无法将reversesuccess_url一起使用,因为在导入模块之前,在加载网址之前会调用reverse

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

要回答有关重新启动runserver的最后一个问题,ImproperlyConfigured错误与TemplateDoesNotExists不同,因为它在加载Django应用程序时出现。

答案 1 :(得分:8)

尝试在CBV中使用reverse_lazy代替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')