lution88

[TIL] Django-Paginator 기능구현 본문

개발일지/# Django

[TIL] Django-Paginator 기능구현

lution88 2022. 3. 7. 22:46

페이지네이션이란?

한 페이지에 데이터가 너무 많은 경우 일정 길이로 나누어서 전달하는 기능이다!

 

Django에서는 페이지네이션 기능을 간편하게 구현할 수 있도록 기능을 제공하고 있기 때문에 쉽게 기능을 구현할 수 있다.

 

Paginator 는 총 두 개의 파라미터만 넘겨주면 된다.

 1) 각각의 페이지로 나뉘게 될 데이터의 목록

 2) 한 페이지에 보여줄 데이터의 수

 

paginator 구현해 보기

1. Views.py 작성

# Paginator 과 Model Import 하기
from django.core.paginator Import Paginator
from .models import Post

# 페이지네이션 구현을 위해 모델을 이용해서 데이터를 가져온다.
def post_list(request):
    posts = Post.objects.all()
    # 페이지네이션(적용할 데이터목록 posts, 한 페이지에 보여줄 데이터 개수 8) 정의
    paginator = Paginator(posts, 8)
    # 쿼리스트링의 page를 이용해서 페이지 번호 뽑아오기
    page_num = request.GET.get('page')
    # 뽑아온 페이지 번호에 해당하는 페이지를 가져와서 template로 렌더해 줍니다.
    page = paginator.page(page_num)
    return render(request, 'post_list.html', {'page':page})

 

2. Templates 작성

- View에서 넘어온 Page를 이용해서 화면을 구성합니다.

# 넘어온 page 의 모든 데이터를 표시할 때는 object_list 를 사용합니다.
{% for post in page.object_list %}
  <p> post로 부터 조회한 데이터 </p>
  <p> {{ post.title }} </p>
{% endfor %}

- 이전페이지, 다음페이지로 가는 오브젝트들도 page가 제공하는 메소드를 이용해서 구현해 줍니다!

- 페이지네이션에서의 링크 이동은 ?page={{number}} 를 통한다.

# 만약 page 에 이전페이지가 있다면
{% if page.has_previous %}
  <a href="?page=1">first</a>
  <a href="?page={{page.previous_page_number}}">previous</a>
  # 이전페이지번호 previous_page_number
{% endif %}
# 현재 페이지 나타내기
<span>
  # page.number 현재페이지번호 | page.paginator.num_pages 페이지네이션 전체 페이지수
  {{page.number}} of {{page.paginator.num_pages}}
</span>
# 만약 다음 페이지가 있다면
{% if page.has_next %}
  # 다음 페이지로 이동
  <a href="?page={{page.next_page_number}}">next</a>
  # 마지막 페이지로 이동
  <a href="?page={{page.paginator.num_pages}}">last</a>
{% endif %}

 

Comments