Django 클래스 기반 뷰 만들기

Kangjik Kim·2025년 1월 23일
0

지금까지 함수 기반 뷰를 사용해 블로그 애플리케이션을 만들었다.
함수 기반 뷰는 간단하지만 쟝고에서는 클래스를 사용해 뷰를 만들 수도 있다.
클래스 기반 뷰는 함수 대신 파이썬 객체로 뷰를 구현하는 방법이다. 뷰는 웹 요청을 받고 응답을 반환하는 함수이므로 뷰를 클래스 메서드로 정의할 수도 있다.
쟝고는 뷰를 구현하는데 사용할 수 있는 기본 뷰 클래스를 제공한다.
이들 모두 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개의 댓글