페이지네이션 이란?
장고에서는 한 페이지에서 표시할 데이터가 너무 많을 때, 데이터를 일정 개수로 나눠 여러 페이지에 나눠 표시해주는 기능을 가지고 있는데, 이를 페이지네이션이라고 합니다.
예를 들어, 블로그의 전체글 리스트의 url은 글들이 많아지면 여러 페이지로 구성되게 되는데요,
https://tomatobaconsoup.tistory.com/?page=1
https://tomatobaconsoup.tistory.com/?page=2
이처럼 url의 맨 뒤에 'page='로 페이지 구분을 하게 됩니다.
바로 페이지네이션을 하는 방법에 대해 알아봅시다. 먼저 Paginator와 모델을 임포트 해줍니다.
from django.core.paginator import Paginator
from my_app.models import MyModel
그리고 페이지를 다음과 같이 나눕니다.
posts = MyModel.objects.all()
# 6개씩 묶어서 페이지를 나누겠다는 뜻
pages = Paginator(posts, 6)
Paginator로 구한 pages는 다음과 같은 속성과 메소드들을 사용할 수 있습니다.
# 페이지가 총 몇개 있는지 확인할 수 있습니다.
pages.page_range
# 페이지 번호로 하나의 페이지를 가져옵니다.
page = pages.page(1)
# 현재 페이지번호를 리턴합니다.
page.number
# 모든 페이지의 개수를 리턴합니다.
page.paginator.num_pages
pages.num_pages
# 한 페이지 내의 내용을 확인할 수 있습니다.
page.object_list
# 다음 페이지가 존재하는지 bool타입으로 리턴합니다.
page.has_next()
# 전 페이지가 존재하는지 bool타입으로 리턴합니다.
page.has_previous()
# 다음 페이지의 번호를 리턴합니다.
page.next_page_number()
# 전 페이지의 변호를 리턴합니다.
page.previous_page_number()
이제 이 페이지네이션을 이용해 글들의 목록을 보는 페이지의 뷰 함수를 작성해 봅시다.
def content_list(request):
contents = MyModel.objects.all()
pages = Paginator(contents, 9)
page_number = request.GET.get("page")
if not page_number:
page_number = 1
page = pages.page(page_number)
return render(request, "my_app/lists.html", {"page": page})
페이지 번호는 url의 쿼리스트링을 통해 넘겨받게되니, request.GET에서 get()메소드를 통해 page값을 가져옵니다. 그리고 첫 접속 시, 그러니까 첫번째 페이지에 처음 접근하는 경우는 page번호를 1로 설정해 줍니다.
"page"라는 이름의 변수로 템플릿에 넘겨주게 되었으니, 템플릿 코드도 page를 이용해야 합니다. 모든 글들의 리스트를 반환하고 싶다면 page.object_list를 써줍니다.
{% for obj in page.object_list %}
<p>{obj.title}</p>
{% endfor %}
그리고 다른 페이지로 넘어가는 버튼도 만들어 줍니다.
{% if page.has_previous %}
<a href="?page=1">처음으로</a>
<a href="?page={{page.previous_page_number}}">전 페이지</a>
{% endif %}
<span>전체{{page.paginator.num_pages}} 중 {{page.number}}</span>
{% if page.has_next %}
<a href="?page={{page.next_page_number}}">다음 페이지</a>
<a href="?page={{page.paginator.num_pages}}">마지막으로</a>
{% endif %}
전 페이지가 존재할 때만 처음으로 가는 버튼이나 전 페이지로 가는 버튼을 만들어줍니다. 다음 페이지로 가는 버튼이나 마지막 페이지로 가는 버튼도 같은 원리 입니다.
'백엔드 > Django' 카테고리의 다른 글
[Django] allauth 패키지 (0) | 2021.10.25 |
---|---|
[Django] 제네릭 뷰 (0) | 2021.10.11 |
[Django] 폼(Form)에 관하여 (0) | 2021.10.05 |
[Django] MVT 구조 (0) | 2021.10.02 |
[Django] 장고 프로젝트 시작하기(Windows) (0) | 2021.09.30 |