Web개발에 필수인 Paginator를 구현하는 방법에 대해서 알아보자.
Django와 Wagtail 둘다 Django Paginator을 사용하니 방법은 동일하다.
1. Models.py (django에서는 View)
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
all_posts = BlogDetailPage.objects.live().public().order_by('-first_published_at')
paginator = Paginator(all_posts, 2) # @todo change to 5 per page
page = request.GET.get("page")
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
context['posts'] = posts
context['categories'] = BlogCategory.objects.all()
return context
코드를 살펴보자.
1)
all_posts = BlogDetailPage.objects.live().public().order_by('-first_published_at')
all_posts 변수에 publish된 모든 BlogDetailPage의 객체들을 발행 순서대로 저장한다는 뜻이다. 재발행은 순서에 영향을 미치지 않는다.
2)
paginator = Paginator(all_posts, 2) # @todo change to 5 per page
Paginator 모듈을 사용하여 한 페이지에 보여질 객체의 갯수를 정한다. all_posts에 저장된 객체들(포스트)을 페이지에 2개씩 표시한다는 의미이다.
3)
page = request.GET.get("page")
page 번호를 GET 메소드를 사용하여 가져온다.
4)
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
try, except를 사용하여 오류처리를 해준다. GET 메소드를 사용하여 가져온 페이지 번호와 포스트들을 posts에 저장한다.
PageNotAnInteger는 파라미터로 전달 된 post의 값이 숫자가 아닌 값이 들어올 때, 페이지 1번으로 이동하라는 의미이다.
EmptyPage는 페이지가 비어있는 페이지일 때, 처리하는 방법이다. 2페이지 밖에 없는데 파라미터 값으로 100같은 숫자가 들어올 때는 존재하는 page 객체들을 posts에 저장한다.
2. Templates
{% if posts.paginator.num_pages > 1 %}
<div class="pagination">
{% if posts.has_previous %}
<li class="page-item">
<a href="?page={{ posts.previous_page_number }}" class="page-link">
<span>«</span>
</a>
</li>
{% endif %}
{% for page_num in posts.paginator.page_range %}
<li class="page-item {% if page_num == posts.number %} active{% endif %}">
<a href="?page={{ page_num }}" class="page-link">
{{ page_num }}
</a>
</li>
{% endfor %}
{% if posts.has_next %}
<li class="page-item">
<a href="?page={{ posts.next_page_number }}" class="page-link">
<span>»</span>
</a>
</li>
{% endif %}
</div>
{% endif %}
Template에서의 표현이다. posts.paginator의 page 갯수가 1개 이상일 때만 표시가 된다.
has_previous는 이전페이지
has_next는 다음 페이지
page_range는 페이지 갯수를 의미한다.
그리고 GET 메소드 사용을 위하여 href에서 page라는 변수에 파라미터 값으로 현재 페이지의 번호를 전달한다.
'Back-End > Wagtail, Django' 카테고리의 다른 글
Wagtail API v2 Settings(Headless CMS) (0) | 2021.11.24 |
---|---|
Wagtail Menu System (0) | 2021.11.23 |
Wagtail StructValue (0) | 2021.11.18 |
Wagtail Sitemap (0) | 2021.11.17 |
Wagtail 참고 사이트 (0) | 2021.11.17 |