使用基于方法的视图时,使用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
)
答案 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')
但是,您无法将reverse
与success_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')