1. django/core/paginator.py의 클래스를 사용하여 paging 처리함
☞ from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage 으로 로딩
2. 메소드
(1) Paginator(전달할 데이터, 한 페이지 당 출력 row수): 생성자
ex) p = Paginator(전달할 데이터, 한 페이지 당 출력 row수)
(2) p.count(): 총 객체 수
(3) p.num_pages(): 총 페이지 수
(4) p.get_page(n):
1) n번 페이지 가져오기
2) 페이지 범위를 벗어난 페이지 번호와 유효하지 않은 페이지 번호도 처리하면서 지정된 1부터 시작하는 인덱스가 있는 개체를 반환
(5) p.page(n): n 번째 페이지 반환
ex) pp = p.page()
(6) pp.has_next(): 다음 페이지의 유무를 boolean으로 반환
(7) pp.has_previous(): 이전 페이지의 유무를 boolean으로 반환
(8) pp.previous_page_number()
1) 이전 페이지 번호 반환
2) 이전 페이지가 없는 경우 EmptyPage 예외 발생
(9) pp.next_page_number()
1) 다음 페이지 번호 반환
2) 다음 페이지가 없는 경우 EmptyPage 예외 발생
(10) pp.start_index(): 현재 페이지의 시작 인덱스 (1부터 시작하는 인덱스 기준)
(11) pp.end_index(): 현재 페이지의 끝 인덱스 (1부터 시작하는 인덱스 기준)
3. 속성
(1) p.page_range: (1부터 시작하는)페이지 리스트 반환
= range(p.num_pages + 1)
(2) pp.object_list: 현재 페이지 개체 목록
(3) pp.number: 현재 페이지 번호
(4) pp.paginator: 연결된 Paginator 개체
4. 예외
(1) PageNotAnInteger: 정수가 아닌 값을 받을 때 제기
(2) EmptyPage: 유효한 값이 주어지지만 해당 페이지에 개체가 없는 경우 제기
<views.py>
from django.shortcuts import render
from mysangpum.models import Sangdata
import MySQLdb
from django.http.response import HttpResponseRedirect
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
def ListFunc(request):
# 페이지 나누기 처리 ------Paginator 클래스-------------
datas = Sangdata.objects.all().order_by("-code")
# = select * from sangdata order by code desc
# 최신 등록된 것을 1페이지에 보여주기 위해 desc정렬
paginator = Paginator(datas, 5)# 페이지당 출력 행수를 생성자로 전달. 5개씩 볼거임
try:
page = request.GET.get("page")
except:
page = 1 #페이지 번호를 안가지고 있을 때는 1페이지로
try:
data = paginator.page(page) #page를 가져온다, page번째 페이지 반환
except PageNotAnInteger:
data = paginator.page(1) # 1페이지 반환
except EmptyPage:
data = paginator.page(paginator.num_pages()) # 마지막 페이지 반환
# paginator.num_pages() = 총 페이지 수
#클라이언트 화면에 개별페이지 번호 표시
allPage = paginator.page_range
# = range(paginator.num_pages + 1)#∵0부터 시작해서
print("allPage:", allPage) # 결과: allPage: range(1, 4)
return render(request, 'list2.html', {'sangpums':data, "allPage":allPage})
#datas를 받아서 paginator에 넘겨주고 paginator는 data에 넘겨줬으니 최종적으로 data만 넘기기
#allPage를 웹 화면에 보여주기 위해서
<list2.html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- paging 처리 -->
<table style="width: 80%; text-align: center;">
{% if sangpums %}
<tr>
<td colspan="3">
{% if sangpums.paginator.num_pages > 1 %} <!-- sangpums.paginator.num_pages: 전체페이지 -->
<div>
{% if sangpums.has_previous %} <!-- 이전페이지 -->
<a href="/sangpum/list?page={{sangpums.previous_page_number}}">«이전</a>
{% endif %}
{% if sangpums.has_next %} <!-- 다음페이지 -->
<a href="/sangpum/list?page={{sangpums.next_page_number}}">다음»</a>
{% endif %}
(페이지: {{sangpums.number}}/{{sangpums.paginator.num_pages}})
</div>
<hr>
{% for p in allPage %}
{% if p > 0 %}
{% if p == sangpums.number %} <!-- 현재페이지 -->
[{{p}}]
{% elif p != sangpums.number %} <!-- 다른페이지 -->
<a href="/sangpum/list?page={{p}}"> {{p}} </a>
{% endif %}
{% endif%}
{% endfor%}
{% endif %}
{% else %}
</tr>
<tr>
<td colspan="5">자료가 없어요</td>
</tr>
{% endif %}
</table>
</body>
</html>
[참고] Pagination | Django documentation | Django (djangoproject.com)
8. Ajax (0) | 2021.05.29 |
---|---|
7. html파일 (0) | 2021.05.29 |
5. 세션 session (0) | 2021.05.29 |
4. Django 설정 파일 (0) | 2021.05.11 |
3. MVT방식 - (3) Template (0) | 2021.05.11 |