[django]DetailView CBV

Hyeseong·2021년 2월 7일
0

django

목록 보기
33/35

서두 👩‍🏫

CBV냐 FBV냐? 논쟁이 많은데. 편한거 사용하면 되겠쥬?
개인적으로 생각하기에는 함수로 차근차근 다져놓고 이후 매번 중복되는 코드를 리팩토링하기위해서 클래스로 넘어가는게 매우 바람직하다라고 생각되네요.

아쨋든 Django Official Document는 물론이거니와 다른 참고 할 만한 웹사이트가 있으니 확인해 보세요.

https://ccbv.co.uk/DetailView를 볼게요.

  • 해당 속성
  • 메소드들에 대한 간략한 리스트업이 된 모습!

본론👨‍🚀

우선 클래스로 짯을때 얼마나 달라지는지 마법?을 볼게요.

CBV로 탈바꿈🧖

rooms/views.py

코드 딸랑 두줄이네요?! ㄹㅇ 마법같네.

from django.views.generic  import ListView, DetailView
from rooms                 import models

class RoomDetail(DetailView): 
    model = models.Room

rooms/urls.py

클래스이름.as_view() 적어줘야해요.

from django.urls import path
from rooms       import views

app_name = 'rooms'

urlpatterns = [
    path('<int:pk>', views.RoomDetail.as_view(), name='detail')
]

room_detail.html이 없다고 하니 기존 detail 페이지에 해당하는 html page이름을 서버에서 찾고있는 이름과 동일하게 변동할게요.

작명 방법은 빨간선, 노란선과 같이 클래스 이름을 소문자화해서,
앞에는 디비에서 가져오는 모델이름! 그리고 뒷 부분은 상속받은 클래스의 이름을 따서 지은것 같은 스멜이 나네요.

그런데 pk인자는 어떻게 알고 urls.py에서 정한걸 DetailView에서 --> room_detail.html로 넘어가서 정상적으로 출력될까요?

이에 대해 알려면 아래 사진에서 빨간부분을 보면 알수 있어요.

  • DetailView의 속성중에서
    • pk_url_kwarg = 'pk'라는 부분이 있는데요. 기본적으로 pk를 기본 값으로 설정해뒀어요.
      만약 pk 대신 다른 이름을 넣고 싶으면 클래스뷰의 pk_url_kwarg = '다른이름'을 적고 이에 맞게 urls.py에도 pk대신 다른이름을 넣어주면되요.

CBV 장점🤴

  1. FBV는 404 오류를 잡기위해 try...except... raise, Http404, redirect, reverse같은 여러가지 소스코드를 작성했지만

  2. CBV는 단 2줄로 퉁쳐버렸다!

class RoomDetail(DetailView): 
    model = models.Room

CBV 단점🧖‍♀

  1. background에서 어떻게 돌아가는지 직관적으로 파악하기 힘들다.
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글