Django를 이용하여 포스팅을 구현할 때 포스팅은 페이지네이션과 무한 스크롤 기법이 있다.
페이지네이션 - 페이지네이션은 디지털 콘텐츠를 웹사이트의 또 다른 페이지들로 분리하는 방법입니다. 사용자는 페이지 하단에 있는 숫자 형식의 링크를 클릭하여 페이지들을 탐색할 수 있습니다. 페이지네이션된 콘텐츠 일반적으로 몇 가지 공통된 주제 혹은 목적들을 지니고 있습니다.
무한 스크롤 - 무한 스크롤은 사용자가 페이지 하단에 도달했을 때, 콘텐츠가 계속 로드되는 사용자 경험(UX, User EXperience) 방식입니다. 이는 마치 끝이 없는 단일 페이지에서 끝없는 정보의 흐름을 경험하게 만듭니다.
무한 스크롤의 경우는 Post의 모든 오브젝트를 가지고 오면되지만 페이지네이션의 경우는 페이지 별로 가지고 와야 한다.
Django에서는 Paginator을 이용하면 페이지네이션을 쉽게 구현할 수 있다.
전체 코드
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from rest_framework import generics
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework_simplejwt.authentication import JWTAuthentication
from posts.models import Post
from posts.serializers import PostSerializer
class PostAPI(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
def get(self, request, *args, **kwargs):
page = self.kwargs.get('page')
paginator = Paginator(self.queryset, 16)
try:
page_obj = paginator.page(page)
except PageNotAnInteger:
page = 1
page_obj = paginator.page(page)
except EmptyPage:
page = paginator.num_pages
page_obj = paginator.page(page)
page_obj = page_obj.object_list
self.queryset = page_obj
return self.list(request, *args, **kwargs)
코드 해석
PostAPI의 아래 쿼리 셋부터 펄미션은 과거에 설명했던 부분이니 생략하고 def get 부분이 페이지네이션을 구현한 내용이다. (어려운 부분이 없으므로 코드를 분리하지 않고 진행한다.)
- 우선 url에서 page 정보를 가지고 온다.
- paginator = Paginator(self.queryset, 16) : 가지고 온 queryset을 16개씩 페이지 네이션을 만든다.
- try, except 구문으로 예외처리를 해주었다. : 페이지 정보가 정수가 아닐 경우 1페이지, 페이지 범위를 벗어날 경우 마지막 페이지를 출력한다.
- page_obj=page_obj.object_list : 객체의 데이터 타입을 쿼리 셋으로 변경해 준다. - DRF 리턴값이 JSON형이 여야함
reference
GitHub - encode/django-rest-framework: Web APIs for Django. 🎸
Web APIs for Django. 🎸. Contribute to encode/django-rest-framework development by creating an account on GitHub.
github.com
Django
The web framework for perfectionists with deadlines.
docs.djangoproject.com
[django 기초] 페이징 처리(pagination) 마스터 하기
이번 포스팅에서는 페이징 처리에 대해 알아보겠습니다. 아주 간단한 개념부터 하나씩 쌓아가는식으로 진행할것이기 때문에 처음부터 하나씩 이해해가며 읽어 주시면 좋겠습니다. 특히 이번
yeko90.tistory.com
'Django > DRF' 카테고리의 다른 글
Django SSE 이용해서 알람 기능 구현 (1) (0) | 2023.10.18 |
---|---|
DRF 구글 소셜로그인 TypeError: string indices must be integers (0) | 2023.10.12 |
DRF 유저 정보로 JWT 토큰 발급 (0) | 2023.10.11 |
Django JWT를 이용한 소셜로그인 (백엔드) (0) | 2023.10.11 |
DRF JWT를 이용하여 유저 정보 GET/POST (0) | 2023.10.11 |