[장고] 디테일뷰에 페이지네이션 추가하기
Django는 강력한 웹 프레임워크로, 다양한 뷰를 쉽게 생성하고 관리할 수 있도록 도와줍니다. 이 중 DetailView는 특정 객체의 세부 정보를 표시하는 데 유용합니다. 하지만 때로는 DetailView에 포함된 객체 목록을 페이지네이션(pagination)하고 싶을 때가 있습니다. 이 글에서는 Django DetailView에 페이지네이션을 추가하는 방법을 소개합니다.
왜 페이지네이션이 필요한가?
페이지네이션은 긴 리스트를 여러 페이지로 나누어 표시하는 기술로, 사용자 경험을 향상시키고, 페이지 로딩 속도를 줄이며, 서버 자원을 효율적으로 관리하는 데 도움이 됩니다. 예를 들어, 특정 파트너의 강의 목록을 표시할 때 모든 강의를 한 페이지에 보여주기보다는, 몇 개씩 나누어 페이지네이션하는 것이 더 효율적입니다.
MultipleObjectMixin과 DetailView의 결합
Django의 ListView는 기본적으로 페이지네이션을 지원하지만, DetailView는 단일 객체를 다루기 때문에 기본적으로 페이지네이션을 지원하지 않습니다. 이를 해결하기 위해 MultipleObjectMixin을 사용하여 DetailView에 페이지네이션 기능을 추가할 수 있습니다.
커스텀 뷰
먼저, MultipleObjectMixin과 DetailView를 함께 사용하여 커스텀 뷰를 만듭니다. MultipleObjectMixin은 여러 객체를 처리할 수 있는 기능을 제공하므로, 이를 통해 DetailView에 페이지네이션을 추가할 수 있습니다.
from django.views.generic.detail import DetailView
from django.views.generic.list import MultipleObjectMixin
class PartnerDetailView(DetailView, MultipleObjectMixin):
model = Partner
paginate_by = 5
def get_context_data(self, **kwargs):
object_list = Lecture.objects.filter(partner=self.get_object())
context = super(PartnerDetailView, self).get_context_data(object_list=object_list, **kwargs)
return context
위의 코드는 PartnerDetailView 클래스를 정의하고 있습니다. 이 클래스는 DetailView와 MultipleObjectMixin을 상속받아, 특정 파트너와 관련된 강의 목록을 페이지네이션하여 보여줍니다. paginate_by 속성을 통해 한 페이지에 표시할 객체의 수를 설정할 수 있습니다.
get_context_data 메서드에서는 현재 파트너와 관련된 강의 목록을 필터링하여 object_list에 할당하고, 이를 컨텍스트에 추가합니다.
템플릿에서의 페이지네이션 처리
이제 템플릿에서 페이지네이션을 처리하는 방법을 살펴보겠습니다. object_list는 파트너와 관련된 강의 목록이며, 페이지네이션이 적용됩니다. 템플릿에서 페이지네이션을 처리하기 위해서는 다음과 같이 작성할 수 있습니다.
{% if is_paginated %}
{% include "includes/pagination.html" %}
{% endif %}
위의 코드는 is_paginated 변수가 참일 경우, 페이지네이션을 위한 템플릿을 포함합니다. includes/pagination.html 파일에는 페이지네이션 컨트롤이 포함되어 있습니다.
pagination.html 예시
pagination.html 파일의 예시는 다음과 같습니다.
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1"><< first</a>
<a href="?page={{ page_obj.previous_page_number }}">< previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next ></a>
<a href="?page={{ page_obj.paginator.num_pages }}">last >></a>
{% endif %}
</span>
</div>
결론
이제 Django DetailView에 페이지네이션을 추가하는 방법을 알게 되었습니다. MultipleObjectMixin을 사용하여 DetailView에서도 페이지네이션을 쉽게 구현할 수 있습니다. 이를 통해 더 나은 사용자 경험을 제공하고, 페이지 로딩 속도를 최적화할 수 있습니다. Django의 강력한 기능을 활용하여, 다양한 요구사항에 맞는 웹 애플리케이션을 만들어 보세요.