August 29, 2020
CBV란 클래스형 뷰의 약자로 Class로 views.py를 구성하는 것을 의미합니다. 다른 말로는 제네릭뷰(generic view)라고도 합니다. CBV는 장고에서 자주 쓰는 기능들을 클래스로 미리 구현해 둔 것이라 상속과 오버라이딩을 사용할 수 있는데 이를 통해 중복되는 코드를 최소화시켜 가독성과 효율을 높일 수 있습니다.
공식문서 CBV는 크게 용도에 따라 상속받을 제네릭뷰를 선택하고, 해당 제네릭뷰에서 제공하는 메소드를 용도에 맞게 상속해 쓰거나 오버라이딩하여 사용하면 됩니다. 자주 쓰는 제네릭뷰는 다음과 같습니다.
뷰 클래스를 생성하는 기본 제네릭 뷰입니다.
View 가장 기본적인 View로 제네릭뷰 중에서도 최상위에 있는 부모클래스입니다. 주로 HTTP 메소드별로 액션을 정의할때 사용합니다.
from django.http import HTTPResponse
from django.views import View
class ExampleView(View):
template_name = 'index.html'
def get(self,request,*args,**kwargs):
return HTTPResonse('get') #이런식으로 표현해도 되고
def post(self,request,*args,**kwargs):
return render(request,self.template_name) #이런식으로도 가능
TemplateView 주어진 템플릿으로 랜더링해주는 뷰입니다.
from django.http import HTTPResponse
from django.views import TemplateView
class ExampleView(TemplateView):
template_name = 'index.html'
def get_context_data(self,**kwargs): #넘겨주는 데이터 추가/변경 메소드
context = super().get_context_data(**kwargs) #부모클래스에서 context 값을 받아옴
context['object_ilst'] = Model.objects.all() #context에 쿼리값 추가
return context
객체의 목록이나 상세정보를 보여주는 뷰 입니다. Display View를 사용하기 위해서는 기본적으로 다음의 과정을 거칩니다.
DetailView 조건을 정하고 그에 맞는 객체의 상세내역을 보여줍니다.
from django.http import HTTPResponse
from django.views import DetailView
class ExampleView(DetailView):
model = ExampleModel #객체가 있는 모델
template_name = 'detail.html'
#별도의 지정값이 없으면 url에서 넘어온 pk값으로 구분하여 랜더링
ListView 조건을 정하고 그에 맞는 객체들의 목록을 보여줍니다.
from django.http import HTTPResponse
from django.views import ListView
class ExampleView(ListView):
model = ExampleModel # 객체가 있는 모델
#queryset = ExampleModel.objects.all()로도 표현가능
template_name = 'list.html'
#별도의 지정값이 없으면 url에서 넘어온 pk값으로 구분하여 랜더링
view에서 사용했던 CBV를 호출하여 페이지를 랜더링하려면 as_view()
라는 메소드를 호출해야합니다.
해당 메소드는 지정된 클래스의 인스턴스를 생성한 후,
인스턴스의 dispatch 메소드를 호출하여 요청을 검사합니다.
검사 후 정의된 HTTP 메소드라면 해당 요청에 맞는 동작을, 정의되지 않은 메소드라면
HttpResponseNotAllowed 라는 예외처리를 해줍니다.