- 데이터를 일정 길이로 나누어서 전달하는 기능
- 일반적으로 가지고 있는 데이터가 한 화면에 모두 보여 주기에 너무 많은 경우 사용
- '이전 페이지로 가기' 또는 '다음 페이지로 가기' 등으로 자주 볼 수 있는 기능
백엔드
- 페이지 별 데이터를 데이터베이스로부터 가져와서 프론트에게 넘겨야함
프론트엔드
- 받은 데이터 목록과 페이지에 대한 정보를 화면에 표시하도록 만들어야함
Django의 페이지네이션
- Paginator를 제공
- 총 두 개의 파라미터
- 각각의 페이지로 나뉘게 될 데이터의 목록
- 한 페이지에 보여줄 데이터의 수
from django.core.paginator import Paginator
from .models import Post
posts = Post.object.all()
paginator = Paginator(posts, 6)
Paginator와 각각의 Page가 가지고 있는 기능
| 메소드&속성 | 설명 | 예시 |
|---|
| {paginator}.count | paginator가 가지고 있는 데이터의 개수 | {paginator}.count |
| {paginator}.num_pages | paginator가 가지고 있는 모든 페이지 수 | {paginator}.num_pages |
| {paginator}.page_range | paginator가 가지고 있는 페이지의 범위(range) | {paginator}.page_range |
| {paginator}.page(num) | paginator가 가지고 있는 페이지 중 num번째 페이지 객체 | {paginator}.page(1) |
| {page}.has_next() | page객체가 다음 페이지가 있는지 여부 | {page}.has_next() |
| {page}.has_previous() | page객체가 이전 페이지가 있는지 여부 | {page}.has_previous() |
| {page}.number | page객체의 현재 페이지 번호 | {page}.number |
| {page}.next_page_number() | page객체의 다음 페이지 번호 | {page}.next_page_number() |
| {page}.previous_page_number() | page객체의 이전 페이지 번호 | {page}.previous_page_number() |
View 작성하기
from django.core.paginator import Paginator
def post_list(request):
posts = Post.object.all()
paginator = Paginator(posts, 8)
page_number = request.GET.get('page')
page_obj = paginator.page(page_number)
return render(request, 'post_list.html', {'page_obj': page_obj})
Template 작성하기
...
{% if page_obj.has_previous %}
<a href="?page=1"> first</a>
<a href="?page={{ page_obj.previous_page_number }}">prev</a>
{% endif %}
<span>
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last </a>
{% endif %}
...
공식문서