Django RedirectView和reverse()不能一起工作?

时间:2011-08-28 01:14:29

标签: python django

我遇到了这个奇怪的问题。

当我这样做时:

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 个答案:

答案 0 :(得分:12)

此问题与在导入URL准备好被撤消之前尝试在导入时反转某些内容有关。这不是RedirectView本身的问题 - 它会发生在您尝试在urls.py文件中反转的任何内容中,或者可能在由其导入的文件中反转。

在Django的开发版本中,有一个名为reverse_lazy的函数专门用于帮助解决这种情况。

如果你使用的是早期版本的Django,那么这里有一个解决方案:Reverse Django generic view, post_save_redirect; error 'included urlconf doesnt have any patterns'

答案 1 :(得分:8)

你需要使用Django 1.4及以上版本的“django.core.urlresolvers”中定义的“reverse_lazy”。

以下是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'),

)

所以在上面的例子中,url“/ redirect-home”将重定向到“/”。希望这会有所帮助。

答案 2 :(得分:5)

无需reverse()reverse_lazy()

只需指定pattern_name参数:

RedirectView.as_view(pattern_name='account-reco-about-you')

答案 3 :(得分:0)

@wtower pattern_name可以,但您可能需要添加名称空间,如下所示。

RedirectView.as_view(pattern_name='polls:index')