Python/초간단 장고 Django

URL namespace 'xxx' isn't unique.

컴닥 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

반응형