Django的RedirectView和reverse()不兼容?

13 投票
4 回答
9665 浏览
提问于 2025-04-17 00:28

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

当我这样做的时候:

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'

撰写回答