以下是当前比较流行的分页器写法,使用简单的paginator自带的分页是达不到这个效果的,我们需要自己更新我们的分页模型。
- 如果当前页为1, 则不显示上一页
- 如果当前页不为1
具体实现
首先定义自己的分页器,扩展系统分页器。在app中创建custom_paginator.py文件
from django.core.paginator import Paginator
class CustomPaginator(Paginator):
def __init__(self, current_page, per_pager_num, *args, **kwargs):
# 当前页
self.current_page = int(current_page)
# 页码最大显示范围
self.per_pager_num = per_pager_num
# 继承父类Paginator的其他属性方法
Paginator.__init__(self, *args, **kwargs)
def pager_num_range(self):
if self.num_pages < self.per_pager_num:
return range(1, self.num_pages + 1)
part = int(self.per_pager_num / 2)
if self.current_page <= part:
return range(1, self.per_pager_num + 1)
if (self.current_page + part) > self.num_pages:
return range(self.num_pages - self.per_pager_num + 1, self.num_pages + 1)
else:
return range(self.current_page - part, self.current_page + part + 1)
def show_first_page(self):
part = int(self.per_pager_num / 2)
if self.current_page > part + 1:
return True
else:
return False
def show_last_page(self):
part = int(self.per_pager_num / 2)
if self.current_page < self.num_pages - part:
return True
else:
return False
在view.py中添加相应的分页内容
def catalog_view(request):
dribbbles_all = Dribbble.objects.filter(detail_flag=1).filter(download_flag=1)
current_page = request.GET.get('page', 1)
paginator = CustomPaginator(current_page, 5, dribbbles_all, 16)
try:
# 取对象的当前页分页对象
posts = paginator.page(current_page)
# current_page非数字时取第一页
except PageNotAnInteger:
posts = paginator.page(1)
# current_page空时取最后一页
except EmptyPage:
posts = paginator.page(paginator.num_pages)
context = {
'dribbbles': posts,
}
return render(request, 'collect/catalog.html', context)
页面模板分页器内容
<!-- Pagination -->
<div class="pagination clearfix">
<nav class="pagination__nav right clearfix">
{% if dribbbles.has_previous %}
<a href="?page={{ dribbbles.previous_page_number }}" class="pagination__page"><i
class="ui-arrow-left"></i></a>
{% endif %}
{% if dribbbles.paginator.show_first_page %}
<a href="?page=1" class="pagination__page">1</a>
<span>...</span>
{% endif %}
{% for p in dribbbles.paginator.pager_num_range %}
<!--如果是当前页,高亮显示-->
{% if p == dribbbles.number %}
<a href="#" class="pagination__page pagination__page--current">{{ p }}</a>
{% else %}
<a href="?page={{ p }}" class="pagination__page">{{ p }}</a>
{% endif %}
{% endfor %}
{% if dribbbles.paginator.show_last_page %}
<span>...</span>
<a href="?page={{ dribbbles.paginator.num_pages }}" class="pagination__page">{{ dribbbles.paginator.num_pages }}</a>
{% endif %}
{% if dribbbles.has_next %}
<a href="?page={{ dribbbles.next_page_number }}" class="pagination__page"><i
class="ui-arrow-right"></i></a>
{% endif %}
</nav>
</div>