Chapter 4-5 Django 블로그에 페이지네이션(Pagination) 기능 구현하기

2025. 5. 7. 10:33·Django

📄 Django 블로그에 페이지네이션(Pagination) 기능 구현하기

1️⃣ 데이터를 대량으로 복사하여 테스트 준비

# 쉘 실행
$ python manage.py shell_plus

# 기존 데이터 복사
blog_list = Blog.objects.all()
new_blog_list = []

# id = None 설정 → 새 인스턴스로 인식
for i in range(10):
    for blog in blog_list:
        blog.id = None
        new_blog_list.append(blog)

# 대량 저장
Blog.objects.bulk_create(new_blog_list)

2️⃣ 뷰에서 페이지네이션 설정 (views.py)

from django.core.paginator import Paginator

def blog_list(request):
    blogs = Blog.objects.all().order_by('-created_at')
    paginator = Paginator(blogs, 10)  # 한 페이지당 10개
    page = request.GET.get('page')
    page_object = paginator.get_page(page)

    context = {'page_object': page_object}
    return render(request, 'blog_list.html', context)

📌 Paginator(전체데이터, 페이지당개수)로 설정
📌 쿼리스트링 ?page=2로 이동 가능


3️⃣ 템플릿에서 블로그 목록에 페이지 객체 적용 (blog_list.html)

{% for blog in page_object %}
    <p>
        <a href="{% url 'blog_detail' blog.pk %}">
            ({{ blog.id }}) {{ blog.title }} - 
            <small>{{ blog.created_at|date:"Y-m-d" }}</small>
        </a    </p>
{% endfor %}

📌 page_object는 현재 페이지의 데이터만 포함


4️⃣ 페이지 하단 네비게이션 추가( 이렇게도가능)

    <div>
        {% if page_object.has_previous %} {# 이전 페이지가 존재할 때 #}
            <a href="?page=1">&laquo; 첫번째</a>
            <a href="?page={{ page_object.previous_page_number }}">이전</a>
        {% endif %}
        <span>
            Page {{ page_object.number }} of {{ page_object.paginator.num_pages }}
        </span>
    {% if page_object.has_next %}
            <a href="?page={{ page.object.next_page_number }}">다음</a>
            <a href="?page={{ page.object.paginator.num_pages }}">마지막</a>

    {% endif %}
    </div>

4️⃣ 페이지 하단 네비게이션 추가

<div>
    {% if page_object.has_previous %}
        <a href="?page=1">&laquo; 첫번째</a>
        <a href="?page={{ page_object.previous_page_number }}">이전</a>
    {% endif %}

    {% if page_object.number|add:-2 > 1 %}
        <a href="?page={{ page_object.number|add:-3 }}">&hellip;</a>
    {% endif %}

    {% for i in page_object.paginator.page_range %}
        {% if page_object.number == i %}
            <span>(현재페이지)</span>
        {% elif i > page_object.number|add:-3 and i < page_object.number|add:3 %}
            <a href="?page={{ i }}">{{ i }}</a>
        {% endif %}
    {% endfor %}

    {% if page_object.paginator.num_pages > page_object.number|add:2 %}
        <a href="?page={{ page_object.number|add:3 }}">&hellip;</a>
    {% endif %}

    {% if page_object.has_next %}
        <a href="?page={{ page_object.next_page_number }}">다음</a>
        <a href="?page={{ page_object.paginator.num_pages }}">마지막 &raquo;</a>
    {% endif %}
</div>

📌 현재 페이지 기준 앞뒤 2~3개만 링크 출력
📌 ... 생략기호(…)로 UX 향상


✅ 요약 체크리스트

항목 설명

데이터 준비 ✅ bulk_create로 대량 테스트 데이터 생성
Paginator 설정 ✅ 10개씩, get_page() 사용
쿼리스트링 기반 이동 ✅ ?page=2, ?page=3 등 링크 구성
페이지 네비게이션 출력 ✅ 이전, 다음, 숫자 링크 구현 완료

💬 페이지네이션은 사용자 경험 향상뿐 아니라 서버의 부하도 줄이는 중요한 기능입니다. Django는 이를 매우 쉽게 지원하므로 꼭 활용해보세요!

'Django' 카테고리의 다른 글

Chapter 4-6 Django 블로그 검색 기능 구현하기  (0) 2025.05.07
Chapter 4-7 Django 블로그 삭제 기능 만들기  (0) 2025.05.07
Chapter 4-4 Django 블로그 수정 기능 구현 (작성자만 수정 가능)  (0) 2025.05.07
Chapter 4-3 Django 작성 기능 만들기 with Form  (0) 2025.05.07
Chapter 4-1 Django [블로그] 상세페이지에 작성자 정보 추가하기  (0) 2025.05.07
'Django' 카테고리의 다른 글
  • Chapter 4-6 Django 블로그 검색 기능 구현하기
  • Chapter 4-7 Django 블로그 삭제 기능 만들기
  • Chapter 4-4 Django 블로그 수정 기능 구현 (작성자만 수정 가능)
  • Chapter 4-3 Django 작성 기능 만들기 with Form
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (702)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (40)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 4-5 Django 블로그에 페이지네이션(Pagination) 기능 구현하기
상단으로

티스토리툴바