欢迎光临
我们一直在努力

Django中分页实现单独包

效果展示如下:

实现搜索后页码同步,普通展示页码,跳转,同步搜索search和page参数。

在Django中单独写一份包来实现分页,跳转操作。

源码和注释如下:

from django.utils.safestring import mark_safe
from copy import deepcopy


class PageData(object):
"""
用于处理页面数据分页的类。

参数:
- request: HttpRequest对象,用于获取请求信息。
- queryset: Django ORM的查询集,用于分页的数据来源。
- page_size: int类型,每页显示的数据条数,默认为10。
- plus: int类型,用于计算显示的页码范围,默认为2,即显示当前页前后各两页。
- page_param: str类型,用于GET请求中表示页码的参数名,默认为'page'。
"""

def __init__(self, request, queryset, page_size=10, plus=2, page_param='page'):
# 深拷贝请求的GET参数,避免修改原请求参数
get_query_dice = deepcopy(request.GET)
self.query_dict = get_query_dice
self.page_param = page_param

# 从请求中获取当前页码,未指定则默认为1,并确保其为整数
page = request.GET.get(page_param, "1")
if page.isdecimal():
page = int(page)
else:
page = 1
self.page = page

# 计算分页的起始和结束位置
self.page_start = (page - 1) * page_size
self.page_end = page * page_size

# 对查询集进行分页,并计算总页数
self.page_queryset = queryset[self.page_start:self.page_end]
self.page_counts = queryset.count()
page_count, div = divmod(self.page_counts, page_size) # 计算总页数和余数
if div:
page_count += 1 # 有余数则页数加1
self.page_count = page_count

# 计算当前页前后各plus页的页码范围
self.plus = plus

def page_html(self):
"""
生成分页的HTML代码。

根据当前页、总页数和设定的显示范围,生成用于前端展示的分页HTML字符串。

返回值:
- page_string: 分页导航的HTML代码,供前端模板使用。
"""
if self.page_count <= 2 * self.plus + 1:
start_page = 1
end_page = self.page_count
else:
if self.page <= self.plus:
start_page = 1
end_page = 2 * self.plus + 1
else:
if (self.page + self.plus) > self.page_count:
start_page = self.page_count - self.plus * 2
end_page = self.page_count
else:
start_page = self.page - self.plus
end_page = self.page + self.plus

page_str_list = []
# 开始构建分页HTML字符串
# 首页和“上一页”链接的生成
self.query_dict.setlist(self.page_param, [1])
page_str_list.append(f'<span class="layui-laypage-count">共 {self.page_counts} 条</span><a href="?{self.query_dict.urlencode()}">首页</a>')

if self.page > 1:
self.query_dict.setlist(self.page_param, [self.page - 1])
page_str_list.append(f'<a class="layui-laypage-prev" href="?{self.query_dict.urlencode()}">上一页</a>')
else:
page_str_list.append(f'<a class="layui-laypage-prev layui-disabled" data-page="0">上一页</a>')

# 页码链接的生成
for page_num in range(start_page, end_page + 1):
if page_num == self.page:
self.query_dict.setlist(self.page_param, [page_num])
page_ele = f'<span class="layui-laypage-curr"><em class="layui-laypage-em" style="background-color:#FFB800;"></em><em>{page_num}</em></span>'
else:
self.query_dict.setlist(self.page_param, [page_num])
page_ele = f'<a href="?{self.query_dict.urlencode()}">{page_num}</a>'
page_str_list.append(page_ele)

# “下一页”链接的生成
if self.page < self.page_count:
self.query_dict.setlist(self.page_param, [self.page + 1])
page_str_list.append(f'<a href="?{self.query_dict.urlencode()}" class="layui-laypage-next">下一页</a>')
else:
page_str_list.append(f'<a class="layui-laypage-prev layui-disabled" data-page="0">下一页</a>')

# 尾页和跳转到尾页链接的生成
self.query_dict.setlist(self.page_param, [self.page_count])
page_str_list.append(f'<a href="?{self.query_dict.urlencode()}">尾页</a>')

# 将列表中的字符串连接成单一的HTML字符串,并确保其在模板中安全地被渲染
page_string = mark_safe(''.join(page_str_list))
return page_string

在调用展示函数中初始化即可:

    index_title = '资产管理'  # 设置页面标题
dict_data = {} # 初始化用于过滤查询的字典

# 处理GET请求中的搜索参数
value = request.GET.get('search')
if value:
dict_data['data_id__contains'] = value # 根据搜索值设置查询条件

# 执行数据库查询
queryset = models.Asset.objects.filter(**dict_data)
page_data = PageData(request, queryset) # 初始化分页数据

# 渲染并返回页面
return render(request, 'asset.html',
{'data_list': page_data.page_queryset, 'index_title': index_title,
'page_string': page_data.page_html()})
赞(0) 打赏
未经允许不得转载:创想未来 » Django中分页实现单独包

评论 抢沙发

评论前必须登录!

 

更好的Python学习

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册