Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- pandas
- 클래스
- 귀무/대립가설
- 투표알고리즘
- Thread
- 리스트컴프리헨션
- 통계
- Process
- python 모듈 설치
- Python
- XML읽기
- 간단한채팅프로그램
- AJAX
- 멀티프로세싱
- eclipse #python
- javascript
- CSS
- DB연동
- get/post
- 웹스크래핑
- 폴더구조변경
- CRUD 게시판
- SQL
- 클로저(closure)
- 나이브베이지안분류
- GAC 자격증
- CSS적용방식
- 서류합격팁
- HTML
- VSCode
Archives
- Today
- Total
EASY PEASY CODING
[파이썬] 페이징 처리 본문
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}}">«이전</a>
{% endif %}
<!-- 다음 페이지 링크 -->
{% if datas.has_next %}
<a href="/sangpum/list?page={{datas.next_page_number}}">다음»</a>
{% endif %}
(페이지:{{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보다 큰 경우에만 처리하며, 현재 페이지는 강조 표시하고 다른 페이지는 링크로 표시합니다.