본문 바로가기
Web Programming/django

[Django] 페이지네이션

by 테리는당근을좋아해 2020. 6. 22.

목표

- 페이지네이션을 사용해 한 페이지당 일정한 수의 글만 제공할 수 있다.

 

 

페이지네이션(Pagination)

한 페이지당 일정한 수의 데이터만 보여주는 기능이다.

 

이런 게시글이 있을 때, 만약 게시글이 10만 건이 있다면, 게시글을 불러오는데 많은 시간을 소모하게 되고 또한 사용자가 특정 게시글을 찾기 위해서 계속해서 마우스 스크롤을 내려야하는 상황이 발생한다.

 

페이지네이션을 사용해 이러한 문제를 해결할 수 있다.

 

페이지네이터는 테이블의 레코드 중 지정한 수 개수만큼 페이지 단위로 관리해 사용자에게 제공한다.

 

 

현재 이 글이 포스트되고 있는 티스토리 블로그에서도 페이지네이션을 확인할 수 있다.

 

 

Views.py(View)

from django.core.paginator import Paginator

def index(request):
    # Post 테이블의 모든 레코드를 불러온다.
    posts_all = Post.objects.all()
    # Post 테이블의 모든 레코드를 페이지네이터에서 5개씩 저장한다.
    paginator = Paginator(posts_all, 5)
    # request 된 page를 저장한다.
    page = request.GET.get('page')
    # reqeust된 page의 레코드를 저장한다.
    posts = paginator.get_page(page)
    
    return render(request, 'index.html', {'posts': posts})

1) Django.core에서 Paginator를 import

2) Post 테이블의 모든 레코드를 paginator에서 지정한 개수만큼 page 단위로 관리

3) request된 page에 해당하는 레코드를 posts에 담아 template으로 전달

 

 

index.html(Template)

<!-- pagination  -->
    <!-- 현재 page 보다 더 이전의 page가 존재한다면 -->
    {% if posts.has_previous %}
        <!-- 제일 첫 page -->
        <a href="?page=1">1</a>
        <!-- 바로 이전 page -->
        <a href="?page={{posts.previous_page_number}}">Previous</a>
    {% endif %}
        <!-- 현재 page -->
        <span>{{posts.number}}<span>
    <!-- 현재 page보다 더 이후의 page가 존재한다면 -->
    {% if posts.has_next %}
        <!-- 바로 다음 page -->
        <a href="?page={{posts.next_page_number}}">Next</a>
        <!-- 마지막 page -->
        <a href="?page={{posts.paginator.num_pages}}">{{posts.paginator.num_pages}}</a>
    {% endif %}

GET 메소드는 url 끝에 ?<key=value>의 형태로 요청 리소스에 대한 정보를 전달한다.

 

a 태그에서 ?page={{요청할 페이지 번호}}를 전달하면 아래와 같이 요청을 전달하고, 

 

view는 이를 처리해 해당하는 page의 Post 레코드를 응답 결과로 템플릿에 전달한다.

 

 

첫 번째 page
마지막 page

페이지네이션이 잘 동작하는 것을 확인할 수 있다.

'Web Programming > django' 카테고리의 다른 글

AWS 서버 배포 - (1) EC2 인스턴스 생성  (0) 2022.06.09
[Django] Model기반 form 형식 지정  (0) 2020.06.22
[Django] 템플릿 확장  (0) 2020.06.22
[Django] 부트스트랩  (0) 2020.06.22
[Django] URL 관리  (0) 2020.06.22

댓글