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를 남겼습니다.
반응형