[Django] CBV 알아보기

🌟Django CBV

🎯CBV란?

CBV란 클래스형 뷰의 약자로 Class로 views.py를 구성하는 것을 의미합니다. 다른 말로는 제네릭뷰(generic view)라고도 합니다. CBV는 장고에서 자주 쓰는 기능들을 클래스로 미리 구현해 둔 것이라 상속과 오버라이딩을 사용할 수 있는데 이를 통해 중복되는 코드를 최소화시켜 가독성과 효율을 높일 수 있습니다.

🎯CBV 사용방법

공식문서 CBV는 크게 용도에 따라 상속받을 제네릭뷰를 선택하고, 해당 제네릭뷰에서 제공하는 메소드를 용도에 맞게 상속해 쓰거나 오버라이딩하여 사용하면 됩니다. 자주 쓰는 제네릭뷰는 다음과 같습니다.

🎯CBV BaseView

뷰 클래스를 생성하는 기본 제네릭 뷰입니다.

  • 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

🎯CBV Generic Display View

객체의 목록이나 상세정보를 보여주는 뷰 입니다. Display View를 사용하기 위해서는 기본적으로 다음의 과정을 거칩니다.

  1. 어떤 테이블의 객체리스트를 가져올건지 지정(속성변수 model이나 queryset, 메소드 get_queryset 오버라이딩)
  2. 해당 객체를 랜더링 할 템플릿 파일위치 지정(속성변수 template_name)
  3. 템플릿 파일로 넘겨줄 객체리스트의 이름 지정(속성변수 contextobjectname)
  4. +) 페이지네이션(속성변수 paginate_by)
  5. DetailView 조건을 정하고 그에 맞는 객체의 상세내역을 보여줍니다.

    from django.http import HTTPResponse
    from django.views import DetailView
    
    class ExampleView(DetailView):
        model = ExampleModel #객체가 있는 모델
        template_name = 'detail.html' 
        #별도의 지정값이 없으면 url에서 넘어온 pk값으로 구분하여 랜더링
  6. 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값으로 구분하여 랜더링

🎯URL 패턴 매핑

view에서 사용했던 CBV를 호출하여 페이지를 랜더링하려면 as_view()라는 메소드를 호출해야합니다. 해당 메소드는 지정된 클래스의 인스턴스를 생성한 후, 인스턴스의 dispatch 메소드를 호출하여 요청을 검사합니다. 검사 후 정의된 HTTP 메소드라면 해당 요청에 맞는 동작을, 정의되지 않은 메소드라면 HttpResponseNotAllowed 라는 예외처리를 해줍니다.

참고 https://wikidocs.net/9623 https://dowtech.tistory.com/4


Written by@이주형
平常心

GitHubFacebook