虽然Django自带的有分页类Paginator,但是不能自定义的显示诸如123 4 567这样的分页方式,因此自定义自己的Paginator类来实现分页功能。
分页分析:
分页情况,包含了以下4种情况。
- 第一种是当你要显示的最大页数,大于你实际拥有的页数的时候
- 第二种是当前页数小于一共要显示多少页的一半的时候
- 第三种是当前页加共显示多少页的一半,大于实际的总页数的时候
- 第四种是当前页大于共显示多少页的一半的时候
代码实现:
新建一个名为mypaginator.py
的文件,代码为如下部分:
# -*- coding: utf-8 -*-
from django.core.paginator import Paginator
class MyPaginator(Paginator):
def __init__(self, current_page, max_pager_num, *args, **kwargs):
self.current_page = int(current_page)
self.max_pager_num = int(max_pager_num)
super(MyPaginator, self).__init__(*args, **kwargs)
def get_start_end(self):
return self.show_page_num()
def show_page_num(self):
# 对应第一种情况
if self.max_pager_num > self.num_pages:
start = 1
end = self.num_pages
return start, end
# 对应第二种情况
part = self.max_pager_num // 2
if self.current_page < part + 1:
start = 1
end = self.max_pager_num
return start, end
# 对应第三种情况
if self.current_page + part > self.num_pages:
start = self.num_pages - self.max_pager_num + 1
end = self.num_pages
return start, end
# 对于第四种情况
if self.current_page > part + 1:
start = self.current_page - part
end = self.current_page + (part - 1)
return start, end
说明:
在__init__
中多定义了两个参数。current_page
是当前页数,可以用来进行页码的跳转以及点击其他页数。max_pager_num-1
是一共要显示多少页。start,end是页面要显示的起始页,和最终页。
在view.py里,代码如下:
def index(request):
posts = Post.objects.all().order_by('created_date')
current_page = request.GET.get('page', 1)
paginator = MyPaginator(current_page, 11, posts, 1)
start, end = paginator.get_start_end()
page_range = range(start, end + 1)
try:
post_list = paginator.page(current_page)
except PageNotAnInteger:
post_list = paginator.page(1)
except EmptyPage:
post_list = paginator.page(paginator.num_pages)
return render(request, 'index.html',
{"post_list": post_list,"page_range": page_range})
在页面当中,可以这样使用:
{% if post_list.has_previous %}
<a href="?page={{ post_list.previous_page_number }}">上一页</a>
{% endif %}
{% for i in page_range %}
{% if post_list.paginator.current_page == i %}
<a style="color: red"
href="?page={{ i }}">{{ i }}</a>
{% else %}
<a href="?page={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
{% if post_list.has_next %}
<a href="?page={{ post_list.next_page_number }}">下一页</a>
{% endif %}