-
[django] 페이지네이션 구현하기(장고 Paginator)Python & Django 2021. 8. 4. 16:30
대부분의 블로그들을 보면, 게시글이 늘어나면 페이지네이션 기능을 통해 대량의 글들을 관리합니다.
장고의 Paginator 를 참고해 이를 구현해보았습니다.
여기서 원리는 url 에 ?page=2 이런 식으로 페이지 번호에 해당하는 url 을 전달하면 이를 뷰에서 받아서 page 의 값인 2에 맞는 페이지와 그에 속한 글들을 보여주는 것입니다. 그리고 다음 페이지를 누르면 url 은 ?page=3 이런 모양으로 바뀌어서 뷰에 전달될 것이고, 3에 해당하는 페이지를 보여줄 것입니다.
# posts/views.py from django.core.paginator import Paginator ... def CategoryView(request, category_name): page = request.GET.get("page") category_posts = models.Post.objects.filter(category=category_name) paginator = Paginator(category_posts, 10) posts = paginator.get_page(page) categories = models.Category.objects.all() return render( request, "posts/categories.html", { "category_name": category_name, "category_posts": category_posts, "categories": categories, "posts": posts, }, )
뷰의 모습입니다.
먼저 Paginator 을 import 해줍니다.
게시글을 보여주는 CategoryView 함수에서 page = request.GET.get("page") 로 page 변수에 request 에서 "page" 값을 가져와서 담아 줍니다. 나중에 url에 page=2 이런 식으로 값을 담아서 보여줘야 하기 때문입니다.
category_posts = models.Post.objects.filter(category=category_name) 은 이전 포스팅에서 말씀드린 것처럼, category 가 같은 모든 posts 를 가져온 것입니다.
paginator = Paginator(category_posts, 10) 은 위에서 import 한 Paginator 이며 장고 문서를 보면, object_list 와 per_page 를 필수 인자로 전달해야 한다고 합니다.
object_list 는 페이지를 나눠줄 객체의 목록입니다. 즉, 위에서 찾아온 카테고리 별 게시물 목록 입니다.
per_page 는 한 페이지에 보여질 객체의 최대 숫자입니다. 저는 한 페이지에 10개의 포스팅을 보여주기 위해 10을 넣었습니다.
posts = paginator.get_page(page) 에서 get_page 메소드는 page 값에 해당하는 Page 객체를 반환합니다. 앞의 예시에서 request에서 "page" 라는 키로 2라는 값을 받아왔습니다. 이를 가지고 두번째 페이지를 전달하게 됩니다.
다음은 템플릿입니다.
<div> {% if posts.has_previous %} <a href="?page={{posts.previous_page_number}}">이전</a> {% endif %} {% for p in posts.paginator.page_range %} <a href="?page={{p}}" class="mx-1">{{p}}</a> {% endfor %} {% if posts.has_next %} <a href="?page={{posts.next_page_number}}">다음</a> {% endif %} </div>
posts 는 "page" 값에 따른 Page 객체입니다.
Page 메소드를 보면 has_previous 와 has_next 는 이전 페이지, 다음 페이지가 있으면 True 를 리턴합니다.
previous_page_number, next_page_number 는 다음, 이전 페이지의 번호를 리턴합니다.
paginator 의 page_range 메소드는 페이지의 번호들을 리스트 형태로 보여줍니다.
이를 활용해 만든 페이지네이터의 모습입니다.
Paginator 와 Page 클래스에 관해 더 자세한 정보가 필요한 분들은 아래 공식 문서를 참고하시기 바랍니다!
참고: https://docs.djangoproject.com/en/3.2/ref/paginator/#paginator
Paginator | Django documentation | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com
'Python & Django' 카테고리의 다른 글
[django] 하나의 URL 에서 여러 페이지네이션 구현하기 (0) 2021.09.10 [django] command 만들기 OneToOneField (0) 2021.09.08 [django] 블로그 카테고리 게시판 만들기(카테고리 별 게시물 리스트, 카테고리 리스트 한 화면에 구현하기) (0) 2021.08.04 [Django] URL 관리하기 (0) 2021.06.02 [Django] Template 상속 (0) 2021.06.02