지난번에 함수형으로 작성한 뷰를 제네릭 뷰로 바꿔보았다.
함수형으로 작성했을 때는 어떻게 동작하는지 이해가 잘됐는데 클래스형으로 작성하다 보니 코드는 단축되었지만 나한테는 좀 마법같이 느껴졌다..
나는야 이해가 안되면 기억이 오래 남지 않는 사람이기 때문에... 오늘은 제네릭 뷰의 동작에 대해서 작성해 보려고 한다 !!
제네릭 뷰란 개발에서 자주 나타나는 개발 패턴의 축약형을 제공하는 뷰이다.
클래스형 뷰를 작성할 때 제네릭 뷰를 상속받아 뷰를 작성할 수 있다.
# myView.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
# urls.py
from django.urls import path
from myapp.views import MyView
urlpatterns = [
path('mine/', MyView.as_view(), name='my-view'),
]
1. as_view()에서 class에 대한 인스턴스를 생성한다.
2. dispatch()가 http method를 알아내어 관련 함수로 연계시킨다.
3. 뷰가 처리할 수 없는 http method인 경우 http_method_not_allowed()를 호출한다.
제네릭 뷰는 항상 다른 클래스를 상속받는 형태인데 그 중 가장 기본이 되는 뷰는 View이다. 따라서 다른 제네릭뷰(ListView, DetailView 등..)는 모두 View를 상속받으며 위에 언급한 함수들을 정의하지 않고 모두 사용 가능하다.
View에 정의 된 메서드들의 흐름은 다음과 같다. 하나씩 살펴보자.
setup( ) - dispatch( ) - http_method_not_allowed( ) - options( )
MyClass를 url에 연결하는 함수로 클래스의 인스턴스를 생성한다.
dispatch( )가 호출되기 전에 뷰를 초기화한다.
요청을 검사하여 http 메서드의 종류(GET, POST, DELETE 등)를 알아내어 http 메서드와 일치하는 메서드에 위임을 시도한다. GET은 get()에, POST는 post() 등에 위임된다.
뷰가 지원하지 않는 http 메서드일 경우 호출된다.
OPTIONS HTTP 요청에 대한 응답을 처리한다.
이름 그대로 리스트를 보여주는 뷰이다. 특정 테이블의 레코드 전체를 보여줄 때 사용한다.
리스트가 테이블 전체 레코드일 경우 사용할 모델 클래스만 지정하면 된다.
class MyView(ListView):
model = Question
특정 테이블의 특정 레코드에 대한 상세 내용을 표시할 때 사용하는 뷰이다.
레코드 조회시 필요한 pk값은 URLconf에서 추출해서 뷰로 넘어온 값을 사용한다.
오늘 배운 점은 다음과 같다.
첫째. 제네릭 뷰의 동작 방식. as_view()가 인스턴스를 생성하여 뷰 내에 정의된 함수를 호출하고 정해진 동작을 수행하는 것.(리스트 표시, 디테일 표시 등)
둘째. 앞에서 배운 ListView, DetailView 등은 사실 실제 프로젝트에서는 사용하지 않는다고 한다. 프로젝트 상황에 맞는 뷰를 View 클래스만 상속받아서 내부에 http method와 같은 이름의 메서드(get(), post() 등)도 정의하여 직접 구현한다고 하니 이 부분은 나중에 더 알게될 것 같다.
나머지 부분은 앞으로 더 공부해가면서 체득하는 부분이라고 생각하고 오늘은 이정도로 선방한걸로..!!
다음에도 파이야 🔥🔥🔥
참고:
[Django] 제네릭 뷰(Generic View) 살펴보기
Base views
[Django] 클래스형 뷰
클래스 기반 뷰 (Class Based View) - ListView, DetailView