지금까지 함수 기반 뷰를 사용해 블로그 애플리케이션을 만들었다.
함수 기반 뷰는 간단하지만 쟝고에서는 클래스를 사용해 뷰를 만들 수도 있다.
클래스 기반 뷰는 함수 대신 파이썬 객체로 뷰를 구현하는 방법이다. 뷰는 웹 요청을 받고 응답을 반환하는 함수이므로 뷰를 클래스 메서드로 정의할 수도 있다.
쟝고는 뷰를 구현하는데 사용할 수 있는 기본 뷰 클래스를 제공한다.
이들 모두 HTTP 메서드 디스패치 및 기타 공통 기능을 처리하는 View 클래스를 상속한다.
클래스 기반 뷰는 아래와 같은 장점을 제공한다.
클래스 기반 뷰를 작성하는 방법을 이해하기 위해 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
이 있다.model = Post
를 사용해 모델을 지정하면 쟝고가 일반적인Post.objects.all()
쿼리셋을 만든다.context_object_name
을 지정하지 않을 경우 기본 변수는 object_list
이다.paginated_by
로 페이징을 정의한다.template_name
을 설정해 커스텀 템플릿을 사용한다.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에서 제공된다.