[장고] 디테일뷰에 페이지네이션 추가하기

소요 시간: 3분

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">&lt;&lt; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">&lt; 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 &gt;</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &gt;&gt;</a>
        {% endif %}
    </span>
</div>


결론

이제 Django DetailView에 페이지네이션을 추가하는 방법을 알게 되었습니다. MultipleObjectMixin을 사용하여 DetailView에서도 페이지네이션을 쉽게 구현할 수 있습니다. 이를 통해 더 나은 사용자 경험을 제공하고, 페이지 로딩 속도를 최적화할 수 있습니다. Django의 강력한 기능을 활용하여, 다양한 요구사항에 맞는 웹 애플리케이션을 만들어 보세요.

장고 리스트