모듈 로드
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">« 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 »</a> {% endif %} </span> </div>