Pagination

Andromeda_Galaxy·2024년 5월 22일

Django

목록 보기
10/12

페이지네이션(Pagination)

  • 데이터를 일정 길이로 나누어서 전달하는 기능
  • 일반적으로 가지고 있는 데이터가 한 화면에 모두 보여 주기에 너무 많은 경우 사용
    • '이전 페이지로 가기' 또는 '다음 페이지로 가기' 등으로 자주 볼 수 있는 기능

백엔드

  • 페이지 별 데이터를 데이터베이스로부터 가져와서 프론트에게 넘겨야함

프론트엔드

  • 받은 데이터 목록과 페이지에 대한 정보를 화면에 표시하도록 만들어야함

Django의 페이지네이션

  • Paginator를 제공
  • 총 두 개의 파라미터
    • 각각의 페이지로 나뉘게 될 데이터의 목록
    • 한 페이지에 보여줄 데이터의 수
from django.core.paginator import Paginator # Django의 Paginator
from .models import Post # 작성한 모델 클래스

posts = Post.object.all() # 모든 데이터를 가져와서
paginator = Paginator(posts, 6) 
# 첫 번째 파라미터 : 페이지로 나뉘게 될 데이터의 목록
# 두 번째 파라미터 :  한 페이지에 보옂루 데이터의 수

Paginator와 각각의 Page가 가지고 있는 기능

메소드&속성설명예시
{paginator}.countpaginator가 가지고 있는 데이터의 개수{paginator}.count
{paginator}.num_pagespaginator가 가지고 있는 모든 페이지 수{paginator}.num_pages
{paginator}.page_rangepaginator가 가지고 있는 페이지의 범위(range){paginator}.page_range
{paginator}.page(num)paginator가 가지고 있는 페이지 중 num번째 페이지 객체{paginator}.page(1)
{page}.has_next()page객체가 다음 페이지가 있는지 여부{page}.has_next()
{page}.has_previous()page객체가 이전 페이지가 있는지 여부{page}.has_previous()
{page}.numberpage객체의 현재 페이지 번호{page}.number
{page}.next_page_number()page객체의 다음 페이지 번호{page}.next_page_number()
{page}.previous_page_number()page객체의 이전 페이지 번호{page}.previous_page_number()

View 작성하기

from django.core.paginator import Paginator

def post_list(request):
    posts = Post.object.all() 
    paginator = Paginator(posts, 8)
    page_number = request.GET.get('page')
    page_obj = paginator.page(page_number) # 페이지 번호에 해당하는 페이지를 가져옴
    return render(request, 'post_list.html', {'page_obj': page_obj})

Template 작성하기

...

{% if page_obj.has_previous %} <!-- 만약 현재 페이지의 이전 페이지가 있다면 -->
    <a href="?page=1"> first</a>
    <a href="?page={{ page_obj.previous_page_number }}">prev</a> <!-- 이전 페이지 번호 -->
{% endif %}

<span>
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
    <!-- page_obj.number : 페이지(page_obj)의 번호 -->
    <!-- page_obj.paginator.num_pages : 페이지를 관리하는 Paginator가 가지고 있는 전체 페이지 수 -->
</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 %}

...

공식문서

profile
안녕하세요.

0개의 댓글