[django] get_absolute_url()

아래와 같은 모델이 있습니다.

방에 대한 모델인데요.
디비에 수많은 방에 대한 레코드들 중에서 특정 방에 대한 접근을 하려면 그 URL을 하드코딩한다는게 상당히 피곤한 일일거에요.

http://127.0.0.1:8000/admin/rooms/room/480/change/

481, 482.. 이렇게 방의 PK가 있는걸 유추해 낼 수 있어요.
Admin Page

메인 페이지

디테일 페이지


get_absolute_url()👩‍🌾

위 메소드는 내가 원하는 모델을 찾을 수 있는 url을 주게되요.

실제 사용하는 방법을 보조.

쑤텝1 대충 뚝딱?! 👨‍💻

메소드 오버라이딩을 하기 위해 models.py에 만들어 주는데요. 놀랍게도 자동으로 잡아주길래 클릭했더니

아래와 같이 DetailView와 관련된 메소드를 엔터 한번만 눌렀는데 내가 원하는 코드를 자동으로 똭! 만들어줍니다. 편리한 기능이에요.
그만큼 자주 사용하니깐. 이렇게 만들어 주는가보다 생각이 드네요.

하지만 지우고 다른거 만들게요.

오버라이딩시 admin_page에서 디테일로 가는 자동 연결 링크 버튼이 생겨요.

오버라이딩 전

오버라이딩 후
없던 버튼 하나가 생겼네요?

버튼 클릭 시

return '/potato' 로 변경해줬더니 저렇게 넘어가게되네요!?

쑤텝2. URLConf의 name & namespace 👨‍💻

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>에 해당하겠쥬?

쑤텝3. 모듈 추가 👨‍💻

from django.urls import reverse

reverse는 url name을 필요로하는 function이고 그 url을 리턴하게되요.

쑤텝4. 오버라이딩 👨‍💻

아래 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 페이지로 넘어가기 위한 자주 사용되는 코드이니 꼭 숙지해야한다는점!

좋은 웹페이지 즐겨찾기