[django] 페이지 네이션 구현

모듈 로드

from django.core.paginator import Paginator

view.py

import math

from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from .models import Post

# Create your views here.
def index(request):
    posts = Post.objects.all().order_by('-published_date')
    paginator = Paginator(posts, 10)
    page = request.GET.get('page')
    contacts = paginator.get_page(page)
    page_range = 5 #페이지 범위 지정 예 1, 2, 3, 4, 5 / 6, 7, 8, 9, 10
    current_block = math.ceil(int(page)/page_range) #해당 페이지가 몇번째 블럭인가
    start_block = (current_block-1) * page_range
    end_block = start_block + page_range
    p_range = paginator.page_range[start_block:end_block]
    return render(request, 'blog/index.html', {
        'contacts': contacts,
        'p_range' : p_range,
    })

start_block = ((current_block-1) * page_range) + 1
end_block = start_block + page_range – 1
위와 같이 계산해 줘야 [1, 2, 3, 4, 5]를 구할 수 있으나 paginator.page_range 배열에서 리스트 슬라이싱을 하기 위해 위 코드처럼 작성 하였다. (리스트는 0부터 시작하기 때문)

list.html

<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}

        {% for i in p_range %}
            <a href="?page={{i}}" {% if contacts.number == i %}class="active" {% endif %}>{{i}}</a>
        {% endfor %}

        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
            <a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>