Django 개발시 흔히 사용하는 Pagination을 구현할 수 있는 3가지 방법을 다뤄보았습니다.
(진행중인 프로젝트 코드를 바탕으로 진행하였습니다)
첫번째는 Python 코드와 Template tag를 활용한 방법입니다.
views.py
def all_rooms(request):
page = request.GET.get('page', 1)
page = int(page or 1)
page_size = 10
limit = page_size * page
offset = limit - page_size
all_rooms = Room.objects.all()[offset:limit]
page_count = ceil(Room.objects.count() / page_size)
return render(request, 'rooms/home.html', context={
'rooms': all_rooms, 'page': page, 'page_count': page_count,
'page_range': range(1, page_count),
})
HTML template
<h5>
{% if page is not 1 %}
<a href='?page={{page|add:-1}}'>Previous</a>
{% endif %}
Page {{ page }} of {{ page_count }}
{% if not page == page_count %}
<a href='?page={{page|add:+1}}'>Next</a>
{% endif %}
</h5>
ex) http://localhost:8000/?page=2
예로 위의 URL로 접속시 page값으로 2를 가져와 limit = 20 , offset = 10 으로 설정하여 Room의 [10:20]에 해당하는 object를 불러와 나열
Previous 클릭시 page = page -1 , Next 클릭시 page = page + 1 (if 조건을 입력함으로써 전후 page가 존재 여부에 따라 보이지않게 설정)
두번째는 Python + Django를 활용한 방법입니다.
views.py
from django.shortcuts import render
from django.core.paginator import Paginator
from .models import Room
def all_rooms(request):
page = request.GET.get('page', 1)
room_list = Room.objects.all()
paginator = Paginator(room_list, 10)
rooms = paginator.get_page(page)
return render(request, 'rooms/home.html', context={'rooms': rooms})
HTML template
<h5>
{% if rooms.has_previous %}
<a href='?page={{rooms.number|add:-1}}'>Previous</a>
{% endif %}
Page {{ rooms.number }} of {{ rooms.paginator.num_pages }}
{% if rooms.has_next %}
<a href='?page={{rooms.number|add:+1}}'>Next</a>
{% endif %}
</h5>
django Paginator를 사용함으로써 queryset과 페이지에 담을 사이즈만으로도 쉽게 페이지네이션을 구현할 수 있습니다.
또한 has_previous나 has_next와 같은 기능을 제공해줌으로써 template에서도 손쉽게 전후 페이지 존재여부를 간편히 체크할 수 있습니다.
마지막으로 CBV를 이용한 방법입니다.
views.py
from django.views.generic import ListView
class HomeView(ListView):
model = Room
paginate_by = 10
paginate_orphans = 5
ordering = 'created'
HTML template
<h5>
{% if page_obj.has_previous %}
<a href='?page={{page_obj.previous_page_number}}'>Previous</a>
{% endif %}
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
{% if page_obj.has_next %}
<a href='?page={{page_obj.next_page_number}}'>Next</a>
{% endif %}
</h5>
별 다른 복잡한 코드들 없이 ListView에서 제공해주는 기능에 값을 추가해주는 것만으로 구현이 가능합니다.
그리고 template에서는 page_obj를 사용하여 작성이 가능합니다.
'아카이브' 카테고리의 다른 글
웹 캐시(WEB Cache) (0) | 2020.03.15 |
---|---|
200313 / TIL (0) | 2020.03.13 |
200310 / TIL (0) | 2020.03.11 |
Django 개발 시 테스트를 위한 fake 데이터 생성하기(Django-seed) (1) | 2020.03.10 |
200309 / TIL (0) | 2020.03.09 |