-
[django] RedirectView, redirect in urls.pyPython/초간단 장고 Django 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를 남겼습니다.반응형