EASY PEASY CODING

[파이썬] 페이징 처리 본문

Python/Django

[파이썬] 페이징 처리

richpotato 2023. 10. 24. 12:24

Paginator란?

페이지네이터(paginator)는 대량의 데이터를 페이지 단위로 나누어 표시하고, 사용자가 페이지를 전환할 수 있도록 하는 기능입니다. 이를 통해 웹 애플리케이션에서 많은 양의 데이터를 관리하고 사용자에게 효과적으로 제공할 수 있습니다.

예를 들어, 게시판 글 목록을 페이지별로 나누어 표시하거나 검색 결과를 여러 페이지로 나누어 표시하는 등의 경우에  Paginator를 사용하면 이러한 작업을 간단하게 할 수 있습니다.

 

Django에서의 사용법

from django.core.paginator import Paginator은 Django에서 페이징 처리를 위한 핵심 모듈을 불러오는 코드입니다. 이 모듈은 큰 데이터셋을 여러 페이지로 나누고 각 페이지에 일정한 수의 항목을 표시하기 위한 기능을 제공합니다. 이를 통해 사용자는 데이터를 더 효과적으로 탐색할 수 있습니다.

 


예시코드

 

# 필요한 라이브러리들을 import합니다.
from django.shortcuts import render, redirect
import MySQLdb
from pro13app.models import Sangdata
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# ListFunc 함수 정의
def ListFunc(request):
    # Sangdata 모델의 모든 객체를 가져와서 code 역순으로 정렬합니다.
    datas = Sangdata.objects.all().order_by('-code')  # 최근 것이 가장 처음에 나오게 하려고 함
    
    # Paginator 클래스를 사용하여 페이지당 5개씩 데이터를 보여주도록 설정합니다.
    paginator = Paginator(datas, 5)  # 페이지 당 5행씩 출력

    try:
        # 현재 페이지 번호를 가져오려 시도합니다.
        page = request.GET.get('page')
    except:
        # 예외가 발생하면 기본적으로 1페이지로 설정합니다.
        page = 1

    try:
        # 해당 페이지의 데이터를 가져옵니다.
        data = paginator.page(page)
    except PageNotAnInteger:
        # 페이지 번호가 정수가 아닌 경우, 1페이지로 설정합니다.
        data = paginator.page(1)
    except EmptyPage:
        # 페이지가 비어있는 경우, 가장 마지막 페이지로 설정합니다.
        data = paginator.page(paginator.num_pages())

    # 개별 페이지 표시 작업용
    allpage = range(paginator.num_pages + 1)
    print('allpage:', allpage)  # range(0, 4)

    # render 함수를 사용하여 list.html 템플릿을 렌더링하고, 데이터와 페이지 정보를 함께 전달합니다.
    return render(request, 'list.html', {'datas': data, 'allpage': allpage})

view.py파일

 

<body>
	<!-- 표 시작 -->
	<table border="1" style="width: 80%;">
		<!-- 테이블 헤더 -->
		<tr>
			<th>코드</th>
			<th>상품명</th>
			<th>수량</th>
			<th>단가</th>
			<th>기타</th>
		</tr>
		<!-- 데이터가 있을 경우 -->
		{% if datas %}
			{% for s in datas %}
			<!-- 각 데이터 행 -->
			<tr>
				<td>{{s.code}}</td>
				<td>{{s.sang}}</td>
				<td>{{s.su}}</td>
				<td>{{s.dan}}</td>
			</tr>
			{% endfor %}
			<!-- 페이지 네비게이션 -->
			<tr>
				<td colspan="5">
					{% if datas.paginator.num_pages > 1 %}
						<div>
							<!-- 이전 페이지 링크 -->
							{% if datas.has_previous %}
								<a href="/sangpum/list?page={{datas.previous_page_number}}">&laquo;이전</a>
							{% endif %}
							<!-- 다음 페이지 링크 -->
							{% if datas.has_next %}
								<a href="/sangpum/list?page={{datas.next_page_number}}">다음&raquo;</a>
							{% endif %}
							&nbsp;&nbsp;
							(페이지:{{datas.number}}/{{datas.paginator.num_pages}})
						</div>
					{% endif %}
					<hr />
					<!-- 전체 페이지 목록 -->
					{% for p in allpage %}
						{% if p > 0 %}
							{% if p == datas.number %}
								[{{p}}]
							{% else %}
								<a href="/sangpum/list?page={{p}}">{{p}}</a>
							{% endif %}
						{% endif %}
					{% endfor %}
				</td>
			</tr>
		<!-- 데이터가 없을 경우 -->
		{% else %}
			<tr>
				<td colspan="5">자료없음</td>
			</tr>
		{% endif %}
	</table>
	<!-- 표 종료 -->
</body>

template파일(list.html)

 

 

1. 페이지 네비게이션 부분:

  • {% if datas.paginator.num_pages > 1 %}: 페이지가 1페이지보다 많을 경우에만 페이지 네비게이션을 표시합니다.
  • 이전 페이지 링크와 다음 페이지 링크를 만듭니다.
  • 현재 페이지 정보를 표시합니다.

 

2. 전체 페이지 목록 부분:

  • {% for p in allpage %}: allpage에 있는 각 페이지 번호에 대해 반복합니다.
  • 페이지 번호가 0보다 큰 경우에만 처리하며, 현재 페이지는 강조 표시하고 다른 페이지는 링크로 표시합니다.