Generic View는 Class based view이다. Django와 DRF 둘 다에서 널리 쓰인다. 함수 기반 뷰도 많이 쓰이나 DRF에서는 뷰를 기본적으로 CBV로 작성하는 경우가 많아 짚고 넘어가려 한다.
Generic View를 쓰면 간편한 장점이 있는데 그만큼 제약도 많다.
1.함수기반 view와 클래스 기반 view의 차이
view를 작성할 때 함수나 클래스 둘 다 가능한 이유는 둘 다 collable object이기 때문이다.
즉, Django의 view는 collable object로 정의하는 것이다.
그러나 함수와 클래스의 차이 중 가장 큰 것은 클래스는 '상속'이 가능하다는 점이다. 따라서 CBV는 상속을 통해 간단히 구현할 수 있다. 그러나 그만큼 미리 약속된 것들도 많다(특히 템플릿에서)
2.CBV작성하기
기본적으로 Django로 웹 어플리케이션을 만드는 것과 동일하고 view만 class로 작성한 예시!
1.모델을 아래와 같이 정의하였다 가정한다.
2.views.py작성하기
model을 임포트했다.
django.views.generic의 list,detail,edit에서 각각 ListView,DeatilView,CreateView,UpdateView,DeleteView를 임포트했다.
함수기반 view는 request를 받아 render를 하는 반면 CBV는 generic view들을 상속받아 적용할 모델이 무엇인지,필드는 무엇인지만 지정하면 끝!기능에 따라서 마치고 갈 success_url로 지정하긴 하지만 훨씬 간단한 코드가 되었다.
각각의 class들은 역할에 따라 템플릿에 연결되어야하는데
BlogView는 블로그 리스트를 담은 html->(소문자)모델이름_list.html
BlogCreate는 form(입력공간)을 담고 있는 html->(소문자)모델이름_form.html
BlogDetail은 상세 페이지를 담은 html->(소문자)모델이름_detail.html
BlogUpdate또한 form을 갖고 있는 html->(소문자)모델이름_form.html
BlogDelete는 삭제를 한 번더 물어보는 html로 연결한다 하자.->(소문자)모델이름_confirm_delete.html
이들 html은 지정된 이름이 있다.
3.template작성하기
앞서 Generic View를 이용하면 약속을 따라야한다 했는데 template에 많이 나타난다.
먼저 함수기반 view를 사용할때는 템플릿 이름을 home.html등 마음대로 지을수 있었지만 Generic view에선 아니다.
*클래스에 따라 지정된 템플릿 이름들
(물론 위치해야 할 곳은 app폴더>template폴더)
(소문자)모델이름_list.html
(소문자)모델이름_detail.html
(소문자)모델이름_form.html
(소문자)모델이름_confirm_delete.html
이렇게 CBV의 사용으로 view에는 템플릿에 어떤 데이터를 어디에 넘겨줄건지 처리 없이도 모델과 필드만 지정하면 알아서 템플릿을 찾아오고 데이터를 넘겨준다.
-app폴더>templates폴더>classblog_list.html에 넘어온 데이터는 object_list
object_list는 지정한 모델로 만들어진 모든 객체들의 목록이다
-app폴더>templates폴더>clssblog_list.html에 넘어온 데이터는 object
object는 지정된(pk값에 맞는)객체
그런데 같은 템플릿에 또 다른 객체를 보여주고 싶은데 둘다 object_list,object로 넘어오면 구분할 길이 없어진다!->요때는 클래스 내에 따로 정의해주면 되지!
BlogView에서 context_object_name='blog_list'
BlogDetail에서 context_object_name='blogpost'이런식으로!
그럼 각각 연결된 템플릿에서 blog_list와 blogpost라는 변수로 오브젝트를 불러올수 있다.
템플릿 이름을 지정된 것 이외에 바꾸고 싶다면->요때도 클래스 내에 지정하기!
template_name='list.html'이렇게!
그런데 blogpost_form.html은 어디갔을까?
이렇게 Django의 view를 클래스 기반으로 작성하는 방법과 특징에 대해서도 알아보았다~!
https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Generic_views
https://www.django-rest-framework.org/api-guide/generic-views/
'[Python,Django]' 카테고리의 다른 글
Django Rest Framework 2.실습-Serializer,ViewSets (0) | 2020.03.16 |
---|---|
Django Rest Framework 1.이론2 (0) | 2020.03.14 |
Django Rest Framework 0.이론1 (0) | 2020.03.13 |
Anaconda 에서 vs code 에디터 사용하기 (0) | 2020.03.06 |
Python 파이썬 기초 문법 (0) | 2020.03.06 |