본문 바로가기
백엔드/Django

[Django] 제네릭 뷰

by 토마토베이컨수프 2021. 10. 11.

제네릭 뷰(Generic View)란?

지금까진 views.py 파일을 함수형 뷰로 기능들을 하나하나 구현했지만, 제네릭 뷰라는 장고 개발자분들이 미리 개발한 뷰를 상속받아 클래스형 뷰를 만듬으로써 글들의 조회/생성/수정/삭제를 좀 더 간단하게 만들 수 있습니다. 한번 하나하나 알아봅시다.

 


먼저 받아와야할 모듈들을 가져옵시다.

from django.views.generic import (
    ListView, CreateView, DetailView, UpdateView, DeleteView,
)
from django.urls import reverse
from .models import Page
from .forms import PageForm

 

글 목록 페이지

class PageListView(ListView):
    model = Page
    paginate_by = 6

놀랍게도 이렇게만 하면 끝입니다. 표시된 변수들, 생략된 변수들에 대한 설명은 다음과 같습니다.

  • model : 모델명을 담는 클래스 변수입니다.
  • paginate_by : 나눠줄 데이터의 개수 단위를 저장하는 클래스 변수 입니다. 자동으로 'page_obj'란 템플릿 변수 이름으로 Page객체를 템플릿으로 보내줍니다.
  • template_name : 템플릿으로 사용할 html파일의 이름을 넘겨주는 클래스 변수 입니다. 이름을 따로 명시하지 않는다면 기본값으로 '<모델명>_list.html' 파일을 찾습니다. 만약 html파일의 이름이 이 기본값을 따른다면 생략해도 되는 클래스 변수입니다.
  • context_object_name : 템플릿에 템플릿 변수명으로 넘겨줄 context의 키 값으로 지정할 이름을 담는 클래스 변수 입니다. 이름을 따로 명시하지 않는다면 기본값으로 'object_list' 또는 '<모델명>_list' 라는 이름으로 설정됩니다. 만약 템플릿코드에서 기본값의 이름을 가진 템플릿변수를 사용하고 있다면 생략해도 됩니다.
  • page_kwarg : 페이지네이션 사용시 현재 페이지를 url의 쿼리스트링 중 어떤 키 값으로 인식할지를 결정할 클래스 변수 입니다. 따로 설정하지 않으면 기본값이 'page'가 됩니다. 이 역시 'page'란 이름을 템플릿에서 사용하고 있다면 생략해도 됩니다. 

 

글 상세 페이지

class PageDetailView(DetailView):
    model = Page
  • template_name : ListView와 마찬가지로 글 상세 정보에 관한 html파일의 이름을 담는 변수로, 기본값은 '<모델명>_detail.html'입니다.
  • pk_url_kwarg : urls.py 작성시 상세페이지 경로를 지정하기 위해 만들었던 변수명을 담는 클래스 변수입니다. 설정해주지 않으면 기본값은 'pk'가 됩니다.
  • context_object_name : 템플릿에 넘겨줄 context의 키 값은 기본값이 'object' 또는 '<모델명>'이 됩니다. ListView를 제외한 모든 제네릭뷰를 상속받는 클래스 뷰는 앞으로 이 클래스 변수의 기본값으로 'object' 또는 '<모델명>'을 넘겨주게 될 것입니다.

 

글 작성 페이지

class PageCreateView(CreateView):
    model = Page
    form_class = PageForm
    def get_succes_url(self):
        return reverse('page-detail', kwargs={'pk': self.object.id})
  • form_class : 이 클래스 변수에 폼의 이름을 넣어줍니다.
  • template_name : 글 생성 뷰에서는 템플릿파일명의 기본값은'<모델명>_form.html'입니다. 
  • get_success_url : 이 함수는, 폼 작성을 마치고 사용자가 입력한 데이터가 성공적으로 제출되었을 때의 로직을 나타냅니다. reverse함수는 url name을 받아 이동할 페이지로 가게 해주고, kwargs라는사전형으로 키워드를 전달합니다. 아까 PageDetailView만들때, 키워드로 'pk'를 인식해 상세페이지로 가도록 바꿨으므로 get_success_url 함수의  kwargs의 키 값을 'pk'로 설정합니다.

 

글 수정 페이지

class PageUpdateView(UpdateView):
    model = Page
    form_class = PageForm
    def get_success_url(self):
        return reverse('page-detail', kwargs={'pk': self.object.id})

글 작성 클래스 뷰랑 다를게 없습니다.

 

글 삭제 페이지

class PageDeleteView(DeleteView):
    model = Page
    def get_success_url(self):
        return reverse('page-list')

글 삭제 시 나오는 삭제 확인에 대한 페이지의 템플릿 파일명의 기본값은 '<모델명>_confirm_delete.html'입니다.

 

 

 

그리고 이제 마지막으로 urls.py의 urlpatterns를 수정해봅시다.

urlpatterns = [
    path('page/', views.PageListView.as_view(), name='page-list'),
    path('page/<int:pk>/', views.PageDetailView.as_view(), name='page-detail'),
    path('page/create/', views.PageCreateView.as_view(), name='page-create'),
    path('page/<int:pk>/update', views.PageUpdateView.as_view(), name='page-update'),
    path('page/<int:pk>/delete', views.PageDeleteView.as_view(), name='page-delete'),
]

이렇게 상세 페이지에 대한 값을 담는 부분의 변수명을 'pk'로 바꾸고, 참조할 클래스 뷰 역시 뒤에 .as_view()를 추가하면 됩니다.

'백엔드 > Django' 카테고리의 다른 글

[Django] 접근 제어  (0) 2021.11.04
[Django] allauth 패키지  (0) 2021.10.25
[Django] 페이지네이션(Pagination) 기능  (0) 2021.10.10
[Django] 폼(Form)에 관하여  (0) 2021.10.05
[Django] MVT 구조  (0) 2021.10.02