【问题标题】:Django RedirectView and reverse() doesn't work together?Django RedirectView 和 reverse() 不能一起工作?
【发布时间】:2011-08-28 01:14: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'))

如果不相关,我会收到错误消息。它说我的最后一个视图没有找到,它在那里。有什么解释吗?同时,我将使用非反向样式。

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您需要在 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”将重定向到“/”。希望这会有所帮助。

      【讨论】:

      • 使用 Django 2.1 from django.urls import reverse_lazy
      【解决方案3】:

      不需要reverse()reverse_lazy()

      只需指定pattern_name参数:

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

      【讨论】:

      • pattern_name 适用于 v >= 1.6。但是,在urls.py 中,它似乎对我不起作用......它返回 410 就像没有指定 url 时一样。
      • 在 django 1.11 中没有帮助
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 2011-07-29
        • 2012-03-25
        • 2019-10-08
        • 2014-01-07
        相关资源
        最近更新 更多