Back-End/Python Django

[django] 클래스형 뷰

Hoplin 2022. 3. 1. 15:16
반응형

클래스형 뷰?

View는 요청을 받아 응답을 반환해주는 호출 가능한 "객체"이다. 함수로도 뷰를 작성할 수 있지만, 클래스로도 작성을 해줄 수 있다. 클래스로 작성된 뷰를 "클래스형 뷰"라고 부르며, 이를 사용하면 상속과 믹스인 기능을 사용해 코드를 재사용할 수 있고, 뷰를 체계적으로 작성할 수 있다.

 

클래스형 뷰의 시작점

앞에서 함수형으로 뷰를 작성할 때는 아래와 같은 형태로 작성을 하였다.

urlpatterns = [
    path('', views.index,name = 'index'),
    path('<int:question_id>/',views.detail,name='detail'),
    path('<int:question_id>/results/',views.results,name='results'),
    path('<int:question_id>/vote/',views.vote,name='vote'),
    path('test/',views.test,name='test')
]

매개변수 순서를 url, view함수, url별명 순서로 넣어주었다. 클래스형 뷰에서는 조금 다르다.

# views.py
from django.shortcuts import render
from django.views.generic.base import TemplateView
# Create your views here.

class BooksModelView(TemplateView):
    template_name = 'books/index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['model_list'] = ['Book','Author','Publisher']


# urls.py
urlpatterns = [
    path('', BooksModelView.as_view(),name = 'index'),
]

클래스형 뷰에 대해 URLconf를 작성할 때는 위와 같이 작성해야한다. 중요한것은 as_view()메소드이다. 장고의 URL해석기는 요청과 관련된 파라미터들을 클래스가 아닌 함수에 전달한다. 그렇기 때문에 클래스형 뷰에서는 클래스 진입을 위한 메소드 as_view()를 제공한다. 이 메소드를 "진입 메소드" 라고 부른다

 

as_view()는 어떤 역할을 할까? 이 메소드는 클래스 인스턴스를 생성하고 그 후 인스턴스의 dispatch()메소드를 호출한다.dispatch()메소드는 요청의 HTTPmethod를 검사한 후 해당 이름을 가진 메소드로 요청을 중계한다. 만약 해당 요청에 대한 메소드가 없으면 HttpResponseNotAllowed예외를 발생시킨다. 예시로 아래와 같이 view클래스를 작성했다고 가정하자

class MyView(View):
    def get(self,request):
        return HttpResponse('result')

이러한 경우, MyView View함수에 대해 get요청을 받은 경우 HttpResponse를 반환하고, 이 외 요청 메소드에 대해서는 예외를 발생하게 된다. 이러한 메소드 중계를 하기까지에 쓰이는 as_view(), dispatch()메소드는 모두 클래스형 뷰가 상속받은 "View"클래스에 정의되어있다.

 

클래스형 뷰의 장점 : 상속기능

클래스형 뷰의 대부분 특징은 장고에서 제공하는 "제네릭 뷰"를 상속받아 작성한다는 것이다. 제네릭 뷰는 뷰 개발 과정에서 단순 반복 기능을 덜어주는 기능이다. 제네릭 뷰는 뷰 개발 과정에서 공통적으로 사용할 수 있는 기능들을 추상화하고, 이를 장고에서 미리 만들어 기본적으로 제공하는 클래스형 뷰들이다.

 

예를 들어 템플릿 파일 내용만 보여주는 TemplateView를 상속해서 뷰를 작성하면 아래와 같이 작성할 수 있다.

#urls.py
urlpatterns = [
    path('',MyView.as_view())
]

#views.py
class MyView(TemplateView):
    template_name = 'books/index.html'

이를 조금 더 단순화하면 아래와 같이 작성할 수 도 있다.

urlpatterns = [
    path('',TemplateView.as_view(template_name='books/index.html'))
]

클래스형 제네릭 뷰

제네릭 뷰도 기본적으로 클래스형 뷰로 작성이 되어있다. 장고에서 제공하는 제네릭 뷰는 크기 4가지로 분류된다.

  • Base View : 뷰 클래스를 생성하고, 다른 제네릭뷰의 부모클래스를 제공하는 기본 제네릭 뷰
  • Generic DisplayView : 객체 리스트를 보여주거나 특정 객체의 상세정보를 보여준다
  • Generic Edit View : 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공한다.
  • Generic Date View : 날짜 기반 객체의 년 / 월 / 일페이지로 구분해 보여준다.

Base View

제네릭 뷰 이름 뷰의 기능 / 역할
View 가장 기본이 되는 최상위 제네릭 뷰. 다른 제네릭 뷰는 모두 이 클래스의 하위 클래스이다.
TemplateView 템플릿이 주어지면 해당 템플릿을 렌더링 한다
RedirectView URL이 주어지면 해당 URL로 리다이렉트 해준다.

Generic Display View

제네릭 뷰 이름 뷰의 기능 / 역할
List View 조건에 맞는 여러개의 객체를 보여준다
DetailView 객체 하나에 대한 상세한 정보를 알려준다.d

Generic Edit view

제네릭 뷰 이름 뷰의 기능 / 역할
FormView 폼이 주어지면 해당 폼을 보여준다
CreateView 객체를 생성하는 폼을 보여준다
UpdateView 기존 객체를 수정하는 폼을 보여준다
DeleteView 기존 객체를 삭제하는 폼을 보여준다.

Generic Date View

제네릭 뷰 이름 뷰의 기능 / 역할
ArchiveIndexView 조건에 맞는 여러개의 객체 및 그 객체들에 대한 날짜 정보를 보여준다
YearArchiveView 연도가 주어지면 그 연도에 해당하는 객체들을 보여준다.
MonthArchiveView 연,월이 주어지면 해당하는 객체들을 보여준다
WeekArchiveView 연도와 주차가 주어지면 그에 해당하는 객체들을 보여준다
DayArchiveView 연,월,일이 주어지면 그 날짜에 해당하는 객체들을 보여준다
TodayArchiveView 오늘 날짜에 해당하는 객체들을 보여준다
DateDetailView 연,월 일 기본 키가 주어지면 해당하는 특정 객체 하나에 대한 상세정보를 보여준다

 

반응형