페이지네이션(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 |
댓글