文章目录
分页组件
应用分页组件,需要以下两个步骤:
-
视图函数中:(先获取queryset,将request和queryset传入分页组件对象中,得到生成的html标签)
pythondef customer_list(request): # 所有数据 queryset = models.Customer.objects.filter(active=1).select_related('level') pager = Pagination(request, queryset) context = { "queryset": queryset[pager.start:pager.end], "pager_string": obj.html() } return render(request, 'customer_list.html', context)
-
在页面上:(直接引用即可)
html{% for row in queryset %} {{row.id}} {% endfor %} <ul class="pagination"> {{ pager_string }} </ul>
pager组件代码
python
import copy
from django.utils.safestring import mark_safe
class Pagination(object):
""" 分页 """
def __init__(self, request, query_set, per_page_count=10):
"""
:param request: 需要用request对象中的GET中的数据进行校验和处理
:param query_set: 查询数据库得到的查询集
:param per_page_count: 每页显示几条数据
"""
# 防止分页操作对后续的使用request.GET有影响
self.query_dict = copy.deepcopy(request.GET)
# 将self.query_dict._mutable设置为True:表示query_dict可修改,默认为False
self.query_dict._mutable = True
# 拿到总数据据数
self.query_set = query_set
total_count = query_set.count()
self.total_count = total_count
# 计算出总共有多少页面
self.total_page, div = divmod(total_count, per_page_count)
if div:
self.total_page += 1
# 对url中的请求参数进行校验处理,决定显示那一页
page = request.GET.get('page')
if not page:
page = 1
else:
if not page.isdecimal():
page = 1
else:
page = int(page)
if page <= 0:
page = 1
else:
if page > self.total_page:
page = self.total_page
self.page = page
# 每页数据条数
self.per_page_count = per_page_count
# 页面第一条数据
self.start = (page - 1) * per_page_count
# 页面最后一条数据
self.end = page * per_page_count
def html(self):
"""
:return: 生成的当前页面的分页栏html
"""
pager_list = []
if not self.total_page:
return ""
# 求出生成的分页栏html显示的页面范围
if self.total_page <= 11:
# 总页码小于11
start_page = 1
end_page = self.total_page
else:
# 总页码比较多
# 判断当前页 <=6: 1~11
if self.page <= 6:
start_page = 1
end_page = 11
else:
if (self.page + 5) > self.total_page:
# 显示最后10页
start_page = self.total_page - 10
end_page = self.total_page
else:
# 显示前后5页
start_page = self.page - 5
end_page = self.page + 5
# 添加url中的参数,而不是替换:?&age=19&name=123&page=1
# 首页
self.query_dict.setlist('page', [1])
pager_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))
# 上一页
if self.page > 1:
self.query_dict.setlist('page', [self.page - 1])
pager_list.append('<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()))
# 当前页+前后5页
for i in range(start_page, end_page + 1):
self.query_dict.setlist('page', [i])
if i == self.page:
item = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
else:
item = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
pager_list.append(item)
# 下一页
if self.page < self.total_page:
self.query_dict.setlist('page', [self.page + 1])
pager_list.append('<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()))
# 尾页
self.query_dict.setlist('page', [self.total_page])
pager_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))
pager_list.append('<li class="disabled"><a>数据{}条{}页</a></li>'.format(self.total_count, self.total_page))
pager_string = mark_safe("".join(pager_list))
return pager_string
def queryset(self):
"""
:return: 生成的当前页面的展示数据
"""
if self.total_count:
return self.query_set[self.start:self.end]
return self.query_set
可能用到django框架中QueryDict知识点,可以看看Django框架中的:QueryDict(处理url参数)
若有错误与不足请指出,关注DPT一起进步吧!!!