Django:名称空间不是唯一的

时间:2018-02-10 12:58:06

标签: django

在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

为第二个映射提供另一个命名空间不起作用。任何解决方案?

2 个答案:

答案 0 :(得分:1)

尝试编写视图以重定向到main /然后在您的网址中包含该视图:

re_path('.*', views.redirect_view)

答案 1 :(得分:0)

在这种情况下,您可以使用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