ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [django] RedirectView, redirect in urls.py
    Python/초간단 장고 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를 남겼습니다. 

    반응형
Designed by Tistory.