오늘 Django 관련 책을 보다가 URL에 관련된 내용을 읽게 되었고, 파이썬의 우아한 URL(Elegant URL) 작성법을 보게 되었다.
책을 보면서 내가 회의실예약사이트에 Query parameter로 링크를 걸었던게 생각이 났고... 책에서 배운 내용을 적용해볼겸 내 코드를 수정해야겠다고 생각했다.
바로 코드를 보기 전에 우선 페이지에 대한 설명이 좀 필요할 것 같다.
회의실예약사이트에 로그인하면 예약 현황 페이지로 이동된다.
예약 현황 페이지는 아래 이미지처럼 오늘 날짜의 전체 회의실 예약 현황을 볼 수 있다.

예약된 칸을 클릭하면 회의의 상세 정보를 볼 수 있고, 빈 칸을 클릭하면 해당 날짜, 회의실, 시간에 회의를 예약할 수 있는 페이지로 이동할 수 있게 구현했다.
아래 이미지처럼 모달창이 뜨게 된다.

처음에 구현할 때 URL에 query string을 붙여 링크를 만들었었다.
~~.com/reservation?date=aaa&room=bbbb&time=cccc 이런 식으로 구현했다.
당연히 views.py에서 받을 때도 time = request.GET['time'] 코드로 값을 가져왔다.
기존에 하던 방식이 익숙해서 이렇게 구현했었는데 오늘 책을 보고 더 직관적이고, Django를 제대로 ? 사용하는 방법으로 바꿔야 겠다고 느꼈다.
Query parameter를 URL parameter로 변경하기 위해서 세가지 부분에 수정이 필요했다.
유저와 가까운 html 파일부터 views.py까지 순서대로 수정을 했다.
링크를 만들 때편의성을 위해 날짜, 회의실정보, 시간 정보가 모두 필요했다.
링크를 타고 들어가면 세가지 정보는 자동으로 입력되도록 구현해 유저는 회의의 제목, 안건, 참석자만 입력하면 바로 회의를 예약할 수 있게 구현했다.
기존의 링크는 Query parameter를 이용했기 때문에
~~.com/reservation?date=aaa&room=bbbb&time=cccc의 형태였다.
이 링크를 URL parameter로 변경하기 위해
~~.com/reservation/aaa/bbbb/cccc로 변경했다.
path('newRez', views.NewRezView.as_view(), name='newrez')
였던 코드를
path('newRez/<str:room>/<str:date>/<str:time>', views.NewRezView.as_view(), name='newrez')
로 변경했다.
문자타입과 변수명을 지정해줬고 다른 조건은 주지 않았다.
날짜 형태로만 입력이 가능하거나 int만 들어가게도 할 수 있지만 조건의 필요성을 느끼지 못했다.
views에서 def get(self, request, *args, **kwargs): 에 urls에서 추가한 변수명대로 인자값을 넣어줘야한다.
따라서
def get(self, request, room, time, date, *args, **kwargs):
로 코드를 변경했다.
그리고 더이상 query parameter에서 값을 가져올 필요가 없으므로
time = request.GET['time']
room = request.GET['room']
date = request.GET['date']
해당 코드는 삭제했다.
이렇게 세 부분에서 코드를 변경해주면 Query parameter를 URL parameter로 변경할 수 있다.