📄 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">« 첫번째</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">« 첫번째</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 }}">…</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 }}">…</a>
{% endif %}
{% 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>
📌 현재 페이지 기준 앞뒤 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 |