Python/Django

[Django] Django Pagination (by. Django Paginator)

yubi5050 2022. 11. 10. 03:52

 

Django에서 게시판을 만드는 방법은 크게 아래 두가지 방향으로 구현이 가능하다. 

  • Django의 Paginator (django.core.paginator import Paginator)
  • DRF(Django Rest Framework)의 Pagination(rest_frameowork.pagination)

 

두 방식은 각기 장단점이 있으며, 서비스(기능) 중심으로 더 결이 잘 맞는 적절한 방향을 정하는 것이 좋다. 

 

해당 글은 Django의 Paginaotor를 이용해 Pagination을 구현하는 방법을 설명한다.

 

1. Project, App 생성

django-admin startproject pagination1
django-admin startapp posts

 

2. settings.py

INSTALLED_APPS = [
    ....,
    'posts',
    'rest_framework',
]

 

3. models.py 

from django.db import models

# Create your models here.
class Post(models.Model):
    class Meta:
        db_table = "article"
    title = models.CharField(max_length=256)
    content = models.CharField(max_length=256)

 

4-1. pagination1 / urls.py

# pagination1/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', include('posts.urls')), 
]

 

4-2. posts / urls.py

# posts/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('page/', views.expagination.as_view()),
]

 

5. serializers.py

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"

 

6. views.py

from django.core.paginator import Paginator

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Post
from .serializers import PostSerializer

# url : posts/page/1
class DjangoPagination(APIView):
    def get(self, request):
        # pagination
        page = request.GET.get("page", 1) # 내가 로드하고자 하는 Page
        posts = Post.objects.all() # 전체 Load
        paginator = Paginator(posts, 3) # 한 페이지에 3개를 넘겨주는 paginator
        post_per_page = paginator.get_page(page) # 데이터에서 3단위로 나눠진 페이지의 N번째 페이지

        # serializer
        results = PostSerializer(post_per_page, many=True).data
        return Response(results, status=status.HTTP_200_OK)

 

7. admins.py 

from django.contrib import admin
from posts.models import Post

admin.site.register(Post)

 

8. 명령어 실행

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver

 

9. Post 데이터 생성

admin 페이지에 접속하여 post 데이터 생성

 

API Test (Postman)

API Request

http://127.0.0.1:8000/posts/page?page=1

 

JSON Response

[
    {
        "id": 1,
        "title": "aa",
        "content": "aaaaaaaa",
    },
    {
        "id": 2,
        "title": "bb",
        "content": "bbbbb",
    },
    {
        "id": 3,
        "title": "ccc",
        "content": "ccccccccccc",
    }
]