Django的RedirectView和reverse()不兼容?
我遇到了一个奇怪的问题。
当我这样做的时候:
from django.core.urlresolvers import reverse
reverse('account-reco-about-you')
# returns '/accounts/recommendations/about-you/'
但是当我这样做的时候:
# Doesn't Work
recommendations = login_required(RedirectView.as_view(url=reverse('account-reco-about-you')))
# Work
recommendations = login_required(RedirectView.as_view(url='/accounts/recommendations/about-you'))
我收到的错误信息和这个问题无关。它说我最后的视图找不到,但其实是存在的。有什么解释吗?在此期间,我会先用不反向的样式来应付。
4 个回答
8
不需要使用 reverse()
或 reverse_lazy()
。
只需简单地指定 pattern_name
参数即可:
RedirectView.as_view(pattern_name='account-reco-about-you')
9
你需要使用“reverse_lazy”,这个东西在Django 1.4及以上版本的“django.core.urlresolvers”里定义。
下面是一个urls.py的例子:
from django.conf.urls import patterns, include, url
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('apps.website.views',
url(r'^$', 'home', name='website_home'),
url(r'^redirect-home/$', RedirectView.as_view(url=reverse_lazy('website_home')),
name='redirect_home'),
)
在上面的例子中,网址“/redirect-home”会重定向到“/”。希望这对你有帮助。
14
这个问题是关于在导入时尝试反转某些东西,但在反转之前,URL 还没有准备好。这不是 RedirectView 本身的问题——在你的 urls.py 文件中,或者可能在它导入的文件中,任何尝试反转的操作都会出现这个问题。
在 Django 的开发版本中,有一个叫做 reverse_lazy
的函数,专门用来解决这种情况。
如果你使用的是早期版本的 Django,这里有一个解决方案:反转 Django 通用视图,post_save_redirect;错误 'included urlconf doesn't have any patterns'。