django框架虽然带有自己的分页功能,但是样式不好看,为了做更好看的分页,需要自定义一个分页工具,话不多说撸起袖子就开干。
1.首先先建一个python文件叫pager.py代码如下:
class Pagination(object):
"""
page_url 翻页url路由
object_list 数据源列表
current_page 当前页
page_size 每页显示的数据条数
maxPageNum 分页条显示的分页数
"""
def __init__(self, page_url, object_list, current_page, page_size=10, maxPageNum=7):
# 翻页的url
self.page_url = page_url
# 分数据源
self.object_list = object_list
# 数据总个数
self.total_count = object_list.count()
# 当前页
try:
v =int(current_page)
if v <=0:
v =1
self.current_page = v
except Exception as e:
self.current_page =1
# 每页显示的行数
self.per_page_item_num = page_size
# 最多显示页面
self.max_page_num = maxPageNum
def start(self):
return (self.current_page -1) *self.per_page_item_num
def end(self):
return self.current_page *self.per_page_item_num
# 获取分页后的数据
def page_list(self):
return self.object_list[self.start():self.end()]
@property
def num_pages(self):
"""
总页数
:return:
"""
a, b =divmod(self.total_count, self.per_page_item_num)
if b ==0:
return a
return a +1
def pager_num_range(self):
# self.num_pages()
# self.num_pages
# 当前页
# current_page
# 最多显示的页码数量 11
# self.per_pager_num
# 总页数
# self.num_pages
if self.num_pages
return range(1, self.num_pages +1)
# 总页数特别多 5
part =int(self.max_page_num /2)
if self.current_page <= part:
return range(1, self.max_page_num +1)
if (self.current_page + part) >self.num_pages:
return range(self.num_pages -self.max_page_num +1, self.num_pages +1)
return range(self.current_page - part, self.current_page + part +1)
def page_str(self):
page_list = []
first ="<li><a href='%s?page=1'></li>" %self.page_url
page_list.append(first)
if self.current_page ==1:
prev ="<li class='previous disabled'><a href='#'>上一页</a></li>"
else:
prev ="<li><a href='%s?page=%s'></a><li>" % (self.page_url, self.current_page -1,)
page_list.append(prev)
for iin self.pager_num_range():
if i ==self.current_page:
temp ="<li><a href='%s?page=%s'>%s</li>" % (self.page_url, i, i)
else:
temp ="<li><a href='%s?page=%s'>%s</a></li>" % (self.page_url, i, i)
page_list.append(temp)
if self.current_page ==self.num_pages:
nex ="<li class='previous disabled'><a href='#'>下一页</a></li>"
else:
nex ="<li><a href='%s?page=%s'>%s</a></li>" % (self.page_url, self.current_page +1,)
page_list.append(nex)
last ="<li><a href='%s?page=%s'>尾页</a></li>" % (self.page_url, self.num_pages,)
page_list.append(last)
return ''.join(page_list)
2.那么建好了这个自定义的分页器后,就开始来测试看看效果怎么样了:
在templates里新建page.html,views文件里加如一个新的函数比如叫page:(注意要记的在urls里添加page的路由)
2.1 views里的代码:
# 使用自定义分页
def page(request):
# 引入刚刚定义好的分页工具
from example.pager import Pagination
# 获取翻页的页码
current_page = request.GET.get('page')
# 查询数据
articles = Article.objects.all()
# 参数说明 第一个为分页的url 第二个为分页数据源,第三个为当前页,第四个为每页显示的数据条数,第五个为分页条分组默认为7个一组
pager = Pagination('/page/', articles, current_page, 5, 7)
return render(request, 'page.html', {"data": pager.page_list(), 'pager': pager})
2.2 page.html 代码:
{%extends 'base.html' %}
{%block title %}自定义分页{%endblock %}
{%block main %}
<ul>
{%for item in data %}
<li> {{item.title }}-{{item.content }}</li>
{%endfor %}
</ul>
<ul class="pagination pagination-sm"> {{pager.page_str|safe }}</ul>
{%endblock %}
2.3 base.html 其实就是引入bootstrap :
<html lang='en'>
<title>{%block title %}{%endblock %}</title>
<head>
<meta charset='utf-8'>
{%load static %}
<link rel="stylesheet" href="{%static 'css/bootstrap.min.css' %}">
<script src="{%static 'js/jquery-3.3.1.min.js' %}"></script>
<script src="{%static 'js/bootstrap.min.js' %}"></script>
{%block head %}{%endblock %}
</head>
<body>
{%block main %}{%endblock %}
</body>
</html>
3.运行效果:
![](https://i-blog.csdnimg.cn/blog_migrate/3b2d1999e00a7010eb6d71e785e9dee9.webp?x-image-process=image/format,png)
4.总结:
好了,django自定义分页就到这里了,但是,这种分页是有些问题存在的,从代码里可以到是通过先查全部数据出来然后对数据列表进行分页处理,当数据量大的时候就不建议这样做了,那么如何做高效的进行分页呢,下篇文章将会做优化,喜欢记得关注我哦,当然,有问题也欢迎提出来!
简书地址: Code人生