Python/초간단 장고 Django

[django] RedirectView, redirect in urls.py

컴닥 2022. 9. 9. 00:42
반응형

board.urls을 2번 인클루드하면 경고가 발생합니다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('board.urls')),
    path('board/', include('board.urls')),
    path('admin/', admin.site.urls),
]
WARNINGS:
?: (urls.W005) URL namespace 'board' isn't unique. You may not be able to reverse all URLs in this namespace

이 상황에서 redirect를 만나면 라우팅이 엉망이 되죠.
그땐 경고가 아닌 에러가 발생합니다. 

 

board앱의 view를
root의 urls에 직접 import해
라우팅을 할 수도 있지만... 
불필요한 의존성이 발생합니다. 

 

1. RedirectView CBV(Class base view) 사용. 

from django.contrib import admin
from django.urls import path, include
from django.views.generic import RedirectView

urlpatterns = [
    # path('', RedirectView.as_view(url='board/')),
    path('', RedirectView.as_view(pattern_name='board:index')),
    path('board/', include('board.urls')),
    path('admin/', admin.site.urls),
]

깔끔합니다. 

https://docs.djangoproject.com/en/4.1/ref/class-based-views/base/#redirectview

 

2. redirect

FBV(Function base view) 느낌으로 redirect함수를 사용할 수도 있습니다. 

from django.contrib import admin
from django.shortcuts import redirect
from django.urls import include, path

urlpatterns = [
    path('', lambda request: redirect('board/')),
    path('board/', include('board.urls')),
    path('admin/', admin.site.urls),
]

파이썬에서는 사용하지 않는 변수의 이름으로 '_'(underscore)를 사용하는 관례가 있습니다. 
관례에 따라 "path('', lambda _: redirect('board/')),"로 작성하는 것이 좋겠습니다만, 
이 람다 함수가 request를 받는 장고 뷰 함수임을 보여주기 위해, 
매개변수에 request를 남겼습니다. 

반응형