클래스형 뷰?
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 | 연,월 일 기본 키가 주어지면 해당하는 특정 객체 하나에 대한 상세정보를 보여준다 |
'Back-End > Python Django' 카테고리의 다른 글
[Django] get_context_data() 메소드의 작동원리 (0) | 2022.03.05 |
---|---|
[Django] apps.py의 간단한 활용 (0) | 2022.03.05 |
[Django] form클래스로 폼 생성하기 (0) | 2022.02.22 |
[Django] 템플릿 상속하기 (0) | 2022.02.22 |
[Django][django template] 템플릿 시스템 (0) | 2022.02.18 |