상세 컨텐츠

본문 제목

6. paging 처리

Django

by evaseo 2021. 5. 29. 17:45

본문

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}}">&laquo;이전</a>
						{% endif %}	
						{% if sangpums.has_next %} <!-- 다음페이지 -->
							<a href="/sangpum/list?page={{sangpums.next_page_number}}">다음&raquo;</a>
						{% endif %}	
						&nbsp;&nbsp;
						(페이지: {{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)

[참고] [Django] 11. Pagination 알아보자 (tistory.com)

 

'Django' 카테고리의 다른 글

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

관련글 더보기