아래와 같은 모델이 있습니다.
방에 대한 모델인데요.
디비에 수많은 방에 대한 레코드들 중에서 특정 방에 대한 접근을 하려면 그 URL을 하드코딩한다는게 상당히 피곤한 일일거에요.
481, 482.. 이렇게 방의 PK가 있는걸 유추해 낼 수 있어요.
Admin Page
메인 페이지
디테일 페이지
위 메소드는 내가 원하는 모델을 찾을 수 있는 url을 주게되요.
실제 사용하는 방법을 보조.
메소드 오버라이딩을 하기 위해 models.py에 만들어 주는데요. 놀랍게도 자동으로 잡아주길래 클릭했더니
아래와 같이 DetailView와 관련된 메소드를 엔터 한번만 눌렀는데 내가 원하는 코드를 자동으로 똭! 만들어줍니다. 편리한 기능이에요.
그만큼 자주 사용하니깐. 이렇게 만들어 주는가보다 생각이 드네요.
하지만 지우고 다른거 만들게요.
오버라이딩 전
오버라이딩 후
없던 버튼 하나가 생겼네요?
버튼 클릭 시
return '/potato' 로 변경해줬더니 저렇게 넘어가게되네요!?
URLConf의 name & namespace
를 사용하는 방법을 템플릿 단위에서 살펴 볼게요.
1 번은 장고형식에 맞게 작성하기 위해 url을 적고요.
2 번은 설정폴더의 urls.py에 정의된 namespace
의 value값이에요
생략
path('rooms/', include('rooms.urls', namespace='rooms')),
생략
3 번은 rooms앱의 urls.py에 name
이라고 된 value에 해당하고
4번은 인자로 받는 부분인데 그곳 라우트의 url을 지칭해요.여기선 위 이미지의 <int:pk>
에 해당하겠쥬?
from django.urls import reverse
reverse는 url name을 필요로하는 function이고 그 url을 리턴하게되요.
아래 reverse는 설명했고 rooms부분은 namespace부분이고 detail은 name부분이며
kwargs는 어디일까요? pk
라는 부분 보니깐 감이 오시겠지만 url에 입력했던 부분인거 기억나나용? 그래서 그대로 스트링으로 입력하고 self.pk
인스턴스의 필드인 pk를 입력해주면 끝나게 됩니다.
def get_absolute_url(self):
return reverse('rooms:detail', kwargs={'pk':self.pk})
관리자 페이지의 상품 혹은 서비스 디테일 페이지의 view on site
버튼을 누르게 되면 아래와 같이 프런트 화면으로 넘어가게 되요.
또한 user의 프로파일 페이지로 넘어갈때도 get_absolute_url()
을 사용할 수 있겠조?
대충 예를 들면
users/models.py
아래의 디테일하게 profile name을 쓸건지 혹은 pk필드명을 쓸건지 말건지는 개발자 선택의 영역이지만 사용하는 방식은 모두 동일해요.
def get_absolute_url(self):
return reverse('users:profile', kwargs={'pk':self.pk})
어드민 페이지에만 국한되는게 아닌 거의 대부분의 페이지에서 이렇게 작동하고 특히 Detail 페이지로 넘어가기 위한 자주 사용되는 코드이니 꼭 숙지해야한다는점!