【问题标题】:Django: namespace isn't uniqueDjango:命名空间不是唯一的
【发布时间】:2018-02-10 12:58:05
【问题描述】:

在 Django 1 中,我曾经有以下 URL 映射:

...
url(r'^main/', include('main.urls', namespace='main')),
url(r'.*', include('main.urls'))

r'.*' 映射始终位于最后一行,以处理各种未映射的 URL。

在 Django 2 中,改为使用以下映射:

path('main/', include('main.urls', namespace='main')),
re_path('.*', include('main.urls')),

虽然它也有效,但 Django 抱怨:

?: (urls.W005) URL namespace 'main' isn't unique. You may not be able to reverse all URLs in this namespace

给第二个映射另一个命名空间不起作用。有什么解决办法吗?

【问题讨论】:

  • 是的,问题和那个帖子一样,但我确实需要包含'main.urls' 两次。或者,有什么方法可以将 whatever url 指向主页?
  • 你为什么不写一个将.*重定向到main/.*的视图
  • re_path('.*', views.redirect_view),
  • re_path('.*', views.redirect_view) 有效!

标签: django


【解决方案1】:

尝试编写一个视图以重定向到 main/,然后在您的 url 中包含该视图:

re_path('.*', views.redirect_view)

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用django.views.generic.base.RedirectView 简单地重定向到所述网址,而无需两次导入。

    urlpatterns = [
        path('main', include('main.urls')),
        re_path('.*', RedirectView.as_view(url='main/your_default_url_in_main_url'), name='main'),
    ]
    

    尝试去掉'main/'的尾部斜杠,改为'main'

    注意:如果您的main.urls 看起来像这样

    urlpatterns = [
        path('/whatever1', view1), 
        path('/whatever2', view2), 
    ]
    

    您必须通过提供RedirectView.as_view(url='main/whatever1') 以默认重定向到view1 来选择重定向默认视图的位置。默认使用'main/whatever2' 重定向到view2

    参考:RedirectView

    【讨论】:

    • 这会导致 url:localhost:8000/main/main/main/...
    • 删除name='main'
    • 删除name='main' 不起作用。 url还是改成localhost:8000/main/main/main/...
    • 如果我输入localhost:8000/whatever/,控制台会显示GET /whatever/GET /whatever/main/GET /whatever/main/main/GET /whatever/main/main/main/……它会一直持续下去。
    • 仍然无法正常工作,同样的错误(重复重定向)。
    猜你喜欢
    • 2019-04-27
    • 2018-06-04
    • 2017-09-28
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2019-07-31
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多