This one was tested with CBV and it's a modified version of the code from this blog post.
Pagination is added in a template tag, so you can just load it for any of your templates rendered with a ListView
, for example, for listing-base.html
:
{% load paginator_tags %}
<!-- your list -->
{% get_pagination 2 1 %}
get_pagination
is a template tag defined in paginator_tags.py
. Changing first_last_amount
and before_after_amount
you can control how many pages you want to show:
Previous 1 2 ... 5 6 7 8 9 10 11 ... 25 26 Next
paginator_tags.py
:
from django import template
register = template.Library()
@register.inclusion_tag('_pagination.html', takes_context=True)
def get_pagination(context, first_last_amount=2, before_after_amount=4):
page_obj = context['page_obj']
paginator = context['paginator']
is_paginated = context['is_paginated']
page_numbers = []
# Pages before current page
if page_obj.number > first_last_amount + before_after_amount:
for i in range(1, first_last_amount + 1):
page_numbers.append(i)
if first_last_amount + before_after_amount + 1 != paginator.num_pages:
page_numbers.append(None)
for i in range(page_obj.number - before_after_amount, page_obj.number):
page_numbers.append(i)
else:
for i in range(1, page_obj.number):
page_numbers.append(i)
# Current page and pages after current page
if page_obj.number + first_last_amount + before_after_amount < paginator.num_pages:
for i in range(page_obj.number, page_obj.number + before_after_amount + 1):
page_numbers.append(i)
page_numbers.append(None)
for i in range(paginator.num_pages - first_last_amount + 1, paginator.num_pages + 1):
page_numbers.append(i)
else:
for i in range(page_obj.number, paginator.num_pages + 1):
page_numbers.append(i)
return {
'paginator': paginator,
'page_obj': page_obj,
'page_numbers': page_numbers,
'is_paginated': is_paginated,
}
_pagination.html
file:
{% if is_paginated %}
<div class="pagination-wrapper">
<ul class="pager">
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
{% endif %}
{% for page in page_numbers %}
{% if page %}
{% ifequal page page_obj.number %}
<li class="disabled"><a href="#">{{ page }}</a></li>
{% else %}
<li><a href="?page={{ page }}">{{ page }}</a></li>
{% endifequal %}
{% else %}
...
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}">Next</a></li>
{% endif %}
</ul>
</div>
{% endif %}