Paginator란?

2024. 9. 13. 12:40·Category/Django
728x90

Paginator는 Django에서 대량의 데이터를 페이지로 나누어 보여주는 기능을 제공하는 클래스입니다. 예를 들어, 게시판에서 질문 목록이나 답변 목록을 페이지별로 나누어 보여줄 때 사용됩니다. 이를 통해 대량의 데이터가 한 번에 로드되는 것을 방지하고, 사용자에게 효율적인 데이터 탐색 환경을 제공합니다.

Paginator 사용법

1. Paginator 임포트

먼저 Paginator 클래스를 사용하기 위해 django.core.paginator에서 임포트합니다.

from django.core.paginator import Paginator

2. Paginator 객체 생성

Paginator 객체는 두 개의 필수 인자를 받습니다:

  • object_list: 페이지로 나누려는 데이터 목록
  • per_page: 한 페이지에 보여줄 항목의 수

예시로 Question 모델에서 데이터를 가져와 한 페이지에 10개의 항목을 표시하도록 설정하는 경우:

from pybo.models import Question
from django.core.paginator import Paginator

question_list = Question.objects.all()  # 질문 목록 가져오기
paginator = Paginator(question_list, 10)  # 한 페이지당 10개의 항목으로 나누기

3. 특정 페이지의 데이터 가져오기

Paginator로 데이터를 나눈 후 특정 페이지의 데이터를 가져오려면 page() 메서드를 사용합니다. 예를 들어 1페이지의 데이터를 가져오려면:

page_number = 1  # 현재 페이지 번호
page_obj = paginator.page(page_number)  # 1페이지의 데이터를 가져옴

4. 템플릿에 전달하여 출력하기

page_obj를 템플릿으로 전달하여 페이지에 맞는 데이터를 보여줍니다.

context = {'page_obj': page_obj}
return render(request, 'pybo/question_list.html', context)

Paginator 주요 속성 및 메서드

  • paginator.count: 전체 게시물의 개수를 반환합니다.
  • paginator.per_page: 페이지당 보여줄 게시물의 개수를 반환합니다.
  • paginator.page_range: 페이지 번호의 범위를 나타냅니다.
  • number: 현재 페이지의 번호를 반환합니다.
  • previous_page_number: 이전 페이지 번호를 반환합니다.
  • next_page_number: 다음 페이지 번호를 반환합니다.
  • has_previous: 이전 페이지가 있는지 확인하여 True 또는 False를 반환합니다.
  • has_next: 다음 페이지가 있는지 확인하여 True 또는 False를 반환합니다.
  • start_index: 현재 페이지의 시작 인덱스를 반환합니다(1부터 시작).
  • end_index: 현재 페이지의 끝 인덱스를 반환합니다(1부터 시작).

전체 흐름 예시

뷰 함수

from django.core.paginator import Paginator
from pybo.models import Question

def question_list(request):
    question_list = Question.objects.order_by('-create_date')  # 최신순으로 정렬
    paginator = Paginator(question_list, 10)  # 한 페이지에 10개 항목
    page_number = request.GET.get('page', 1)  # GET 요청에서 페이지 번호 가져오기, 기본값은 1
    page_obj = paginator.page(page_number)  # 해당 페이지의 데이터 가져오기
    context = {'page_obj': page_obj}
    return render(request, 'pybo/question_list.html', context)

템플릿에서 페이지 처리

템플릿에서는 page_obj를 사용하여 데이터를 출력하고, 이전 페이지, 다음 페이지로 이동할 수 있는 링크를 추가할 수 있습니다.

<div>
    {% for question in page_obj %}
        <p>{{ question.subject }}</p>
    {% endfor %}
</div>

<div>
    {% if page_obj.has_previous %}
        <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}

    <span>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>
    {% endif %}
</div>

정리

  • Paginator: 데이터를 페이지 단위로 나누는 클래스
  • Paginator.page(): 특정 페이지의 데이터를 가져오는 메서드
  • page_obj: 페이지 정보 및 데이터를 담고 있는 객체
  • 템플릿에서: 페이지 탐색을 위해 page_obj의 속성들을 활용

이 방법을 사용하면 대량의 데이터를 효율적으로 페이지 단위로 나누어 보여줄 수 있습니다.

728x90

'Category > Django' 카테고리의 다른 글

django-environ란?  (0) 2024.09.16
WSGI(웹 서버 게이트웨이 인터페이스, Web Server Gateway Interface)란?  (1) 2024.09.15
Django(장고) 템플릿 필터란?  (0) 2024.09.13
장고(Django) 역참조를 위한 '모델명_set'  (0) 2024.09.11
장고(Django) 마이그레이션이 필요한 경우와 필요 없는 경우  (0) 2024.09.11
'Category/Django' 카테고리의 다른 글
  • WSGI(웹 서버 게이트웨이 인터페이스, Web Server Gateway Interface)란?
  • Django(장고) 템플릿 필터란?
  • 장고(Django) 역참조를 위한 '모델명_set'
  • 장고(Django) 마이그레이션이 필요한 경우와 필요 없는 경우
Corinee
Corinee
  • Corinee
    Coding Note
    Corinee
  • 전체
    오늘
    어제
    • 분류 전체보기 (357) N
      • Category (352) N
        • Algorithm (7)
        • SQL (2)
        • Java (4)
        • C (9)
        • React (7)
        • JavaScript (9)
        • CSS (2)
        • Node (1)
        • SpringBoot (26)
        • Database (3)
        • Network (1)
        • Django (6)
        • Python (21)
        • Flask (4)
        • iOS (25)
        • Swift (4)
        • Flutter (11)
        • Dart (3)
        • Git (1)
        • Firebase (1)
        • Gof (1)
        • 정보처리기사 (112)
        • AI (5)
        • NestJs (4)
        • Docker (1)
        • 사이드 프로젝트 (0)
        • Note (80) N
        • Socket (1)
        • 개인 정보 처리 방침 (1)
        • 면접 (0)
        • Vue.js (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    원시값(primitive)
    쉽게 풀어쓴 C언어 Express
    시맨틱 버전(semantic versioning
    react
    named export vs default export
    core web vitals
    styled-components
    inp
    mermaid-cli
    stdlib.h
    json.parse(json.stringify())
    x.y.z (메이저.마이너.패치)
    중첩 함수(nested function)
    public vs assets
    ajax (asynchronous javascript and xml)
    소프트웨어 버전 관리
    counter
    Collections
    semver)
    jackson 라이브러리
    structuredclone()
    Jest
    프로세스 강제 종료
    javascript 필수 문법
    useEffect
    chrome extension 자동 배포
    defaultdict
    react router
    math.h
    intellij 콘솔 한글 깨짐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Corinee
Paginator란?
상단으로

티스토리툴바