본문 바로가기
아카이브

Django Pagination - 페이지네이션

by PilYeooong 2020. 3. 13.

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_previoushas_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