[Python,Django]

Generic View

럭키🍀 2020. 3. 13. 17:12

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.모델을 아래와 같이 정의하였다 가정한다.

앱폴더>models.py 이후에 migrate도 하고 admin에도 등록하고,,

2.views.py작성하기

model을 임포트했다.

django.views.generic의 list,detail,edit에서 각각 ListView,DeatilView,CreateView,UpdateView,DeleteView를 임포트했다.

app폴더>view.py

함수기반 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 

app폴더>templates폴더>classblog_list.html

 

app폴더>templates폴더>clssblog_list.html

 

app폴더>templates폴더>classblog_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://docs.djangoproject.com/en/2.2/ref/class-based-views/base/#django.views.generic.base.View.setup

 

 

Base views | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Generic_views

 

Django Tutorial Part 6: Generic list and detail views

이 튜토리얼은 LocalLibrary website에 책과 저자의 목록과 세부 페이지를 추가 하여 확장할 것입니다. 이 글에서 우리는 제네릭 클래스-기반 뷰(generic class-based views)에 대해 배울 것이며, 그것이 일반적인 사용 사례를 위해 작성해야 하는 코드들을 줄이는 방법을 보여줄 것입니다. 우리는 또한 URL 처리에 대해 더 세부적으로 알아볼 것이며, 기본 패턴 매칭(basic pattern matching)을 수행하는 방법을 보

developer.mozilla.org

https://www.django-rest-framework.org/api-guide/generic-views/

 

Generic views - Django REST framework

 

www.django-rest-framework.org