Django-mysite만들기8 URL 간결화 - namespace(app_name주기)
24 Jun 2019 | django python django-ormDjango project mysite의 application이 늘어나면서
project의 urls.py가 복잡해졌다.
urlpatterns = [
path('', main_views.index),
path('user/joinform', user_views.joinform),
path('user/joinsuccess', user_views.joinsuccess),
path('user/join', user_views.join),
path('user/api/checkemail', user_views.checkemail),
path('user/loginform', user_views.loginform),
path('user/login', user_views.login),
path('user/logout', user_views.logout),
path('user/updateform', user_views.updateform),
path('user/update', user_views.update),
path('guestbook/list', guestbook_views.list),
path('guestbook/write', guestbook_views.write),
path('guestbook/delete/<int:no>', guestbook_views.delete),
path('guestbook/delete', guestbook_views.delete),
path('board/list/<int:page>', board_views.list),
path('board/list/', board_views.list),
path('board/writeform', board_views.writeform),
path('board/writeform/<int:no>', board_views.writeform),
path('board/write', board_views.write),
path('board/<int:no>', board_views.view),
path('board/modify/<int:no>', board_views.modifyform),
path('board/modify', board_views.modify),
path('board/delete/<int:no>', board_views.delete),
path('admin/', admin.site.urls),
]
너무 많은 url 매핑들…!
복잡해진 코드를 해결하기 위해서 각각의 Django App 안에 urls.py 파일을 만들고,
메인 urls.py 파일에서 각 Django App의 urls.py 파일로 URL 매핑을 위탁하게 코드를 수정하자!
[1] 각각의 App안에 urls.py 만들기
[2] 각각 App에서 urls.py 매핑해주기
맨 위의 아주 긴~ urls.py를 각각의 app매핑에 따라서 urls.py로 나눠 배치해준다.
ex) board기능
board/urls.py
from django.urls import path
from . import views # 해당 app의 views import!
urlpatterns = [
# path는 main에서 `board/` url을 위탁시키기에 그 뒤의 주소부터 넣어준다.
path('list/<int:page>', views.list),
path('list/', views.list),
path('writeform', views.writeform),
path('writeform/<int:no>', views.writeform),
path('write', views.write),
path('<int:no>', views.view),
path('modify/<int:no>', views.modifyform),
path('modify', views.modify),
path('delete/<int:no>', views.delete),
]
이렇게 모든 app의 각각의 urls.py를 만들어 코드를 나눠주면 된다.
[3] 메인 urls.py에서 include 해주기
include모듈을 import해준다.
from django.urls import include
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('main.urls')),
path('user/', include('user.urls')),
path('guestbook/', include('guestbook.urls')),
path('board/', include('board.urls')),
path('admin/', admin.site.urls),
]
main urls.py의 코드가 아주 간결해졌다!
[4] URL 간결화시키기 (app_name 주기)
각각의 app의 urls.py를 분리시킨 뒤,
templates html에서 사용하는 url를 간결화를 위해서
app_name
과 각각 url path에 name을 줄 수 있다.
ex) board/urls.py
from django.urls import path
from . import views
app_name = 'board'
urlpatterns = [
path('list/<int:page>', views.list, name='list_page'),
path('list/', views.list, name='list'),
path('writeform', views.writeform, name='writeform'),
path('writeform/<int:no>', views.writeform, name='reply_writeform'),
path('write', views.write, name='write'),
path('<int:no>', views.view, name='view'),
path('modify/<int:no>', views.modifyform, name='modifyform'),
path('modify', views.modify, name='modify'),
path('delete/<int:no>', views.delete, name='delete'),
]
언뜻보면, urls.py 코드가 길어져 더 복잡해 보일 수 있지만,
이렇게 각각의 name을 주고 나면, url 매핑을 할때 하드코딩을 피할 수 있게 된다.
ex) board/write.html
파라미터 보내기
위의 urls.py에서,
path('writeform/<int:no>', views.writeform, name='reply_writeform'),
위와 같이 파라미터를 보내는 경우 어떻게 처리해야할까?
[5] views에서도 간결한 처리 가능
redirect로 처리할 경우
return redirect('board:view', article_id)
이런식으로 처리할 수 있다.