(2023.3.16) Today_I_Learned_day-144

imRound·2023년 3월 16일
0
post-thumbnail

django.core.paginator

  • Django에서 페이징 기능을 구현할 수 있도록 도와주는 클래스
  • 사용자가 페이지 이동 시 서버에서 해당 페이지에 대한 데이터만 가져와 빠르게 랜더링 가능

기능

  • 대량의 데이터를 페이지 단위로 나누어 보여줄 수 있다.
  • 페이지 단위로 이전, 다음, 첫, 마지막 페이지 등의 기능 제공
  • 페이지 단위로 데이터 정렬 및 필터링 가능
  • 페이지 단위로 검색 가능

예제

from django.core.paginator import Paginator
from example.models import Example

def example_view(request):
		example_data_list = Example.objects.all()
		paginator = Paginator(exampe_data_list, 30) # 30개씩 페이지를 나눈다.

		page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    context = {
        'page_obj': page_obj
    }

    return render(request, 'my_template.html', context)

get_page()

page_obj = Paginator.get_page(2) # 2번째 페이지 데이터를 가져옴

Page 클래스의 객체를 사용해 데이터를 리스트 형태로 가져오기

data_list = page_obj.object_list # 현재 페이지의 데이터를 리스트로 가져온다.

# Page 클래스가 제공하는 기능

"""
object_list: 페이지에 속한 객체들의 리스트를 반환
has_previous: 현재 페이지 이전 페이지가 있는지 여부를 반환
has_next: 현재 페이지 다음 페이지가 있는지 여부 반환
previous_page_number: 현재 페이지의 이전 페이지 번호를 반환
next_page_number: 현재 페이지의 다음 페이지 번호를 반환
has_other_pages: 현재 페이지 이외에 다른 페이지가 있는지 여부를 반환
start_index: 현재 페이지의 시작 인덱스 반환
end_index: 현재 페이지의 끝 인덱스 반
"""
__init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True)
"""
object_list: 페이지네이션 대상 객체
per_page: 한 페이지에 보여질 객체의 수
orphans: 마지막 페이지에서 몇 개의 객체가 남았을 때 그 갯수
allow_empty_first_poage: 첫 페이지에 데이터가 없을 때도 페이지를 보여줄 것인지
count: 총 갯수 반환
num_pages: 페이지의 총 갯수 반환
page(self, number): 주어진 페이지 번호에 해당하는 'Page' 객체 반
"""
  • PageNotAnInteger

    • GET 요청에서 page 파라미터가 정수가 아닌 값으로 전달되었을 때 발생
    • 페이지 번호를 지정하지 않고 요청을 보낸 경우
    • 페이 번호가 실수 등의 형태로 잘못 전달된 경우
    • 페이지 번호 대신 다른 값을 전달한 경우 등
  • 일반적으로 1페이지를 보여주도록 처리하는 예시

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def my_view(request):
    my_objects = MyModel.objects.all()
    paginator = Paginator(my_objects, 25)

    page_number = request.GET.get('page')
    try:
        page_obj = paginator.get_page(page_number)
		# 예외 발생 시 1페이지 반환
    except PageNotAnInteger:
        page_obj = paginator.get_page(1)
		# 예외 발생 시 마지막 페이지 반
    except EmptyPage:
        page_obj = paginator.get_page(paginator.num_pages)

    context = {
        'page_obj': page_obj
    }

    return render(request, 'my_template.html', context)
profile
Django 개발자

0개의 댓글