Django

Django Pagination 구현하기

체리1001 2021. 9. 3.

페이지네이션(Pagination)이란 데이터를 일정 길이로 나누어서 전달하는 기능이다.

게시판 같은 경우 한 페이지 속에 너무 많은 글이 있다면 보기가 어려울 것이다.

그렇기 때문에 페이지를 나눠주는 Pagination을 구현해 줄 필요가 있다.

 

페이지네이션 구현은 백엔드에서는 페이지 별 데이터를 넘겨주고,

프론트엔드에서는 받은 데이터 목록과 페이지에 대한 정보를 화면에 표시해줘야 한다.

 

우선 Paginator를 사용하기 위해서는 import를 해줘야 한다.

#views.py
...
from django.core.paginator import Paginator

 

페이지에 들어갈 데이터를 모두 가져온 뒤 paginator를 만들어주면 된다.

#views.py 

def post_list(request):
    posts = Post.objects.all()
    paginator = Paginator(posts, 6) #paginator 만들기 
    curr_page_number = request.GET.get('page') #get으로 쿼리스트링에 접근
    # 쿼리스트링은 name과 value로 이루어져있으니 name을 적어줘서 쿼리스트링 value에 접근한다.
    if curr_page_number is None: #제일 처음 페이지는 number가 없을테니!! 그럴때는 1로 설정해주자
        curr_page_number = 1
    page = paginator.page(curr_page_number) #해당 페이지 가져오기
    return render(request,'posts/post_list.html', {'page': page} )

posts = Post.objects.all()

을 사용해서 모든 데이터를 가져온다.

 

 

paginator = Paginator(데이터 목록, 한 페이지 당 원하는 데이터의 개수)

paginator = Paginator(posts, 6)을 통해서

한 페이지에 6개의 데이터가 나오도록 paginator를 만들어준다.

 

Paginator.page(number)

page 함수를 사용해서 원하는 number의 페이지를 가져올 수 있다.

 

 

이제 page라는 name으로 넘겨준 페이지를 템플릿에서 보여주면 된다.

#post_list.html

...
<div class="paginator">
    {% if page.has_previous %}
        <a href="?page=1" class="first">first</a> 
        <a href="?page={{page.previous_page_number}}" class="prev">prev</a>
    {% endif %}
    <span>
        <p>{{page.number}} of {{page.paginator.num_pages}}</p>
    </span>
    {% if page.has_next %}
        <a href="?page={{page.next_page_number}}" class="next">next</a>
        <a href="?page={{page.paginator.num_pages}}" class="last">last</a>
    {% endif %}
</div>

 

{paginator}.has_previous

현재 페이지 앞에 또 다른 페이지가 존재하는지 알고싶을 때 사용하는 함수이다.

 

{paginator}.has_next

현재 페이지 뒤에 또 다른 페이지가 존재하는지 알고싶을 때 사용하는 함수이다.

 

{paginator}.next_page_number

현재 페이지의 다음 페이지의 번호가 몇번인지 알고싶을 때 사용하는 함수이다.

 

이외에도 paginator의 다양한 함수가 존재한다.

이에 대해 더 알고싶다면 공식 문서를 참고하면 좋을 것 같다.

https://docs.djangoproject.com/en/3.2/ref/paginator/#django.core.paginator.Paginator

'Django' 카테고리의 다른 글

초기에 필요한 데이터가 있을 때 (seeding)  (0) 2022.01.13
공공데이터 api post 사용 방식  (1) 2021.12.16
데이터 유효성 검사  (0) 2021.08.30
model form  (0) 2021.08.30
폼(Form)이란?  (0) 2021.08.29

댓글