ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • URL namespace 'xxx' isn't unique.
    Python/초간단 장고 Django 2021. 6. 28. 06:25
    반응형
    # board/urls.py
    
    from django.urls import path
    
    from .views import (... 생략 ...)
    
    app_name = 'board'
    
    urlpatterns = [
        path('', ArticleList.as_view(), name='index'),
        ... 생략 ...
    ]
    

    앞서 만들었던 BBS에서 urls.py에 app_name (템플릿과 urls.py에서 사용할 수 있는 네임스페이스)을 지정하면 다음 경고가 발생한다. 

     

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

    (사용한) URL 네임스페이스가 unique 하지 않다.
    당신은 이 네임 스페이스에 있는 모든 URLs를 리버스 할 수는 없을 것이다. 

     

    여기서 reverse라는 것은
    urls.py에 선언해둔 namespace를 이용하여
    URL을 받아와서 사용할 수 있게 해주는 기능이다. 

    reverse를 사용하면
    python 코드에서 URL을 하드 코딩할 필요가 없어지고, 
    URL이 변경되어도, URL Reverse가 변경된 URL을 추적하게 된다.

    이 경고의 원인은 프로젝트의 main 라우터(urls.py)에서 
    board.urls로 가는 경로를 2개 지정했기 때문이다. 

    거슬러 올라가면서 URL을 찾다가
    합류점(Y 모양이랄까?)이 나오면
    어디서 온 것이라 하기 애매해지니까
    경고가 나오는 것... 

    # config/urls.py 
    
    from django.contrib import admin 
    from django.urls import path, include 
    
    urlpatterns = [ 
    path('', include('board.urls')), 
    path('admin/', admin.site.urls), 
    path('board/', include('board.urls'), name='board') 
    ]
    

     

    해결 방법:

    경로를 직접 지정하지 말고 redirect 해주면 된다. 

    from django.shortcuts import redirect
    
    # path('', include('board.urls')),
    path('', lambda request: redirect('board/')),

    다만 urls.py에서는 바로 redirect 해줄 수가 없으니.. 
    주로 views.py에서 봤던 redirect를
    람다를 사용해서 코딩하면 깔끔하다. 

    출처: https://stackoverflow.com/questions/15706489/redirect-to-named-url-pattern-directly-from-urls-py-in-django

    반응형
Designed by Tistory.