본문 바로가기

Web + APP/Django

Class Based View

반응형
SMALL

Django는 abstract(추상화)을 위한 많은 것을 가지고 있습니다. 예를 들어서 models.py는 Database 위에서 abstract를 하죠.

 

Class Based View도 마찬가집니다. 같은 행동을 두 번 이상 안하려고 똑똑한 개발자들은 이를 추상화 모델로 만들어놓았죠.

 

당연히 Class Based View를 쓰려면 class를 선언해야합니다.

from django.views.generic import ListView


class HomeView(ListView):
	pass

Django에는 Listview라고 있습니다. 이 Listview는 Class Based View라고 불리는 가족으로부터 탄생했죠. ListView는 페이지가 objects의 목록을 대변한다고 나와있습니다. 즉, objects의 목록을 Page에 띄워주는 친구죠.

# path는 url과 함수만을 가지는데, class를 못 가지니까 뒤에 as_view() 메소드를 붙혀야합니다.
urlpatterns = [path("", room_views.HomeView.as_view(), name="home")]

여기까지 하면 아마 model을 만들어라고 할겁니다.

모델 정의햇 !

class HomeView(ListView):
	# 어떤 model을 우리가 list하고 싶느냐를 선택합니다.
    model = models.Room

여기까지 하면 Template도 없다고 징징거릴겁니다.

징징인가.

신기한거는 rooms/room_list.html을 없다고 합니다. HomeView가 자동적으로 템플릿을 찾기 때문입니다. 앱 이름이 rooms이기 때문에 rooms/room_list.html을 찾는 것이죠. 

 

그래서 templates 안에 room_list.html 파일을 만들어주면 잘 동작이 될 것입니다 !

 

render / request / template_name 이런거 다 필요없습니다. 그냥 자기 알아서 다 해주는게 Django의 장점이죠. 그리고, render로 context를 넘겨주지 않더라도, 자동으로 접근할 수 있는 object list가 있습니다.

{% for room in object_list %}
	<h1>{{ room.name }}</h1>
{% endfor %}

이러면 자기 알아서 방 이름 쫙 뱉어냅니다. 제가 view에서 넘긴 것도 없는데 말이죠 ! 대박 !

 

ListView에 대해서 더 알아 봅시다.

 

ListView의 문제점은 좀 헷갈린다는 점입니다. ListView에서 Ancestors (MRO) 내부에 BaseListView도 있고, MultipleObjectMixin 등도 있습니다.

 

이게 다 뭘까요?

 

이걸 잘 설명해놓은 사이트가 있습니다. 물론 영어임 ㅋ

https://ccbv.co.uk/

 

Django Class-Based-View Inspector -- Classy CBV

What are class-based views anyway? Django's class-based generic views provide abstract classes implementing common web development tasks. These are very powerful, and heavily-utilise Python's object orientation and multiple inheritance in order to be exten

ccbv.co.uk

대부분의 class based view를 보여주는 곳입니다. 제가 쓸 수 있는 모든 설정을 볼 수 있습니다. 물론 Documentation을 봐도 되죠. ccbv 사이트의 경우엔 간략하게 속성을 볼 수 있으니 좋아용. Documentation은 method를 보기 좋고.

 

pagination을 만들어 볼까요? ccbv에 들어가서 ListView로 들어가면 아마 이렇게 속성이 나와 있습니다.

한 눈에 볼 수 있죠 !

자, 여기서 paginate_by 속성을 이용하면 pagination을 만들 수 있습니다.

class HomeView(ListView):
	# 어떤 model을 우리가 list하고 싶느냐를 선택합니다.
    model = models.Room
    paginate_by = 10
    paginate_orphans = 5
    page_kwarg = "page"
    ordering = "created"

이러면 끝남. 순서도 세울 수 있습니다.  page 키워드를 정해서 쿼리의 키워드를 정할 수도 있죠. 사실 이건 프로그래밍이 아니고, 그냥 추상화를 사용하는 것입니다.

 

정말 간단하지 않나요 ?

 

이게 Class Based View의 장점입니다. 저희가 코드를 짤 필요가 없어요 ;;

 

Django 만세 !

 

근데 class based view가 너무 해주는게 많아서, 싫어하는 사람들도 많습니다. 찐 개발자가 아닌 느낌이죠. 근데, 나쁜건 아니죠.

 

django class based view vs function based view를 구글에 치더라도 정말 많은 말이 있습니다. 열띤 토론을 펼치죠.

최고의 난제

유독 view에서 이런 열띤 토론이 일어나는 이유는 선택지가 두 개이기 때문입니다. model의 경우엔 class로 선언하는 한 가지 방법 밖에 없죠. 만약, 방법 이 여러가지 였다면 논쟁을 요래저래 했겠죠.

 

view는 2가지 방법이 있습니다. 함수 vs 클래스.

 

사실 둘 다 좋아요. class based view의 경우 한 가지의 일은 기똥차게 잘합니다. 위에 작성한 ListView만 보더라도 간단하게 저희가 원하는 일을 할 수 있었죠. function based view의 경우엔 자기 입 맛대로 쓰임새를 변경할 수 있으니까요. 복잡한 폼이 있다거나 페이스북 로그인, 여러 엘리먼트에 대한 필터링이 필요한 경우 function based view를 써야겠죠 !

 

여러분들 마음대로 쓰시면 됩니다.

 

class based view의 경우 get_context_data라는 메소드가 있습니다. 얘는 리턴을 하면 그게 context가 됩니다. 템플릿으로 가는 변수 context요 ! 이를 이용해서 저희가 원하는 저희만의 context를 추가할 수 있습니다. 이런 것들도 짜여져있는 class이기 때문이죠.

 

음.. 아직도 뭘 써야하는지 모르겠다면, 여러분들이 원하는 것을 한 번 만들어보시는 것을 추천드립니다. 저도 그러고 있거든요 ㅎㅎ;;


이상 Class Based View였습니다. ^_^

반응형
LIST

'Web + APP > Django' 카테고리의 다른 글

Get, Post 요청을 모두 알아서 처리하는 FormView !  (4) 2020.05.30
Managers와 QuerySets의 이해  (0) 2020.05.02
추상 모델  (0) 2020.04.29
커스텀 유저 모델  (0) 2020.04.29
Django Setting 하기 !  (0) 2020.04.18