Django 클래스 기반 뷰 만들기

Kangjik Kim·2025년 1월 23일

지금까지 함수 기반 뷰를 사용해 블로그 애플리케이션을 만들었다.
함수 기반 뷰는 간단하지만 쟝고에서는 클래스를 사용해 뷰를 만들 수도 있다.
클래스 기반 뷰는 함수 대신 파이썬 객체로 뷰를 구현하는 방법이다. 뷰는 웹 요청을 받고 응답을 반환하는 함수이므로 뷰를 클래스 메서드로 정의할 수도 있다.
쟝고는 뷰를 구현하는데 사용할 수 있는 기본 뷰 클래스를 제공한다.
이들 모두 HTTP 메서드 디스패치 및 기타 공통 기능을 처리하는 View 클래스를 상속한다.

클래스 기반 뷰는 아래와 같은 장점을 제공한다.

  • GET, POST, PUT 등 HTTP 메서드와 관련된 코드를 조건부 분기 대신 별도의 메서드로 구성
  • 다중 상속을 사용해 재사용 가능한 뷰 클래스(믹스인) 생성

게시글 목록에 클래스 기반 뷰 사용하기

클래스 기반 뷰를 작성하는 방법을 이해하기 위해 post_list 부와 동일한 새로운 클래스 기반 뷰를 생성해 보자.
쟝고에서 제공하는 ListView 뷰를 상속한 클래스를 만든다.
ListView를 사용하면 모든 유형의 객체들을 나열할 수 있다.

blog의 views.py 파일을 편집해 아래 코드를 추가해보자.

from django.views.generic import ListView

class PostListView(ListView):
    queryset = Post.published.all()    
    context_object_name = 'posts'
    paginate_by = 3
    template_name = 'blog/post/list.html'

PostListView 뷰는 이전에 만든 post_list와 유사하다.
ListView 클래스를 상속한 클래스 기반의 뷰를 구현했는데, 이 클래스 기반 뷰는 다음과 같은 속성을 가진다.

  • 모든 객체를 조회하지 않고 커스텀 쿼리셋을 사용하기 위한 queryset 이 있다.
    queryset을 사용하지 않고 model = Post 를 사용해 모델을 지정하면 쟝고가 일반적인
    Post.objects.all() 쿼리셋을 만든다.
  • 쿼리 결과를 위한 context 변수 posts를 사용한다. context_object_name 을 지정하지 않을 경우 기본 변수는 object_list 이다.
  • 페이지당 3개의 객체를 반환하도록 paginated_by 로 페이징을 정의한다.
  • template_name 을 설정해 커스텀 템플릿을 사용한다.
    기본 템플릿을 설정하지 않으면 ListView는 기본적으로 blog/post_list.html 을 사용한다.

이제 아래와 같이 urls.py 파일을 편집해 이전의 post_list URL 패턴을 주석 처리하고, PostListView 클래스를 사용해 새로운 URL 패턴을 추가해보자.

path('', views.PostListView.as_view(), name='post_list'),

페이징 작업르 계속하려면 템플릿에 전달되는 올바른 페이지 객체를 사용해야 한다.
쟝고의 ListView는 page_obj 라는 변수에 요청된 페이지를 전달한다.
아래와 같이 올바른 변수를 사용해 paginator를 include 하도록 post/list.html을 편집해야 한다.

{% include "pagination.html" with page=page_obj %}

HTTP 404 상태 코드를 반환하는 예외 처리는 ListView에서 제공된다.

0개의 댓글