Django项目中自定义分页器
django项目中数据分页展示
- 在项目的根目录下新建目录
- 在该目录中新建一个py文件,如:pagination.py
- 导入组件 mark_safe
- 自定义类
具体实现逻辑
pagination.py文件
from django.utils.safestring import mark_safe import copy class Pagination: def __init__(self, request, all_count, max_show=9, per_num=15): """ :param request: request对象 :param all_count: 总数据量 :param max_show: 最多显示的页码数 :param per_num: 每页显示的数据条数 """ # 获取URL参数 query_dic_url_param = copy.deepcopy(request.GET) # 设置为可修改 query_dic_url_param._mutable = True self.query_dic_url_param = query_dic_url_param # 当前页码 self.current_page = request.GET.get('page', '1') if self.current_page.isdecimal(): self.current_page = int(self.current_page) else: self.current_page = 1 # 最多显示的页码数 self.max_show = max_show half_show = max_show // 2 # 每页显示的数据条数 self.per_num = per_num # 总数据量 self.all_count = all_count # 总页码数 self.total_num, more = divmod(all_count, per_num) if more: self.total_num += 1 # 总页码数小于最大显示数,显示总页码数 if self.total_num <= max_show: self.page_start = 1 self.page_end = self.total_num else: # 总页码数大于最大显示数,最多显示11个 if self.current_page <= half_show: self.page_start = 1 self.page_end = max_show elif self.current_page + half_show >= self.total_num: self.page_end = self.total_num self.page_start = self.total_num - max_show + 1 else: self.page_start = self.current_page - half_show self.page_end = self.current_page + half_show @property def start(self): """ :return: start page """ return (self.current_page - 1) * self.per_num @property def end(self): """ :return:end page """ return self.current_page * self.per_num @property def show_li(self): # 存放 li 代码 html_list = [] # 为URL设置page参数, 重新拼接设置参数后的URL self.query_dic_url_param.setlist('page', [1]) if self.current_page == 1: first_li = '<li class="disabled"><a>首页</a></li>' else: first_li = f'<li><a href="?{self.query_dic_url_param.urlencode()}">首页</a></li>' html_list.append(first_li) if self.current_page == 1: prev_li = '<li class="disabled"><a> < </a></li>' else: # 为URL设置page参数, 重新拼接设置参数后的URL self.query_dic_url_param.setlist('page', [self.current_page - 1]) prev_li = '<li><a href="?{}"> < </a></li>'.format(self.query_dic_url_param.urlencode()) html_list.append(prev_li) for num in range(self.page_start, self.page_end + 1): # 为URL设置page参数, 重新拼接设置参数后的URL self.query_dic_url_param.setlist('page', [num]) if self.current_page == num: li_html = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dic_url_param.urlencode(), num) else: li_html = '<li><a href="?{}">{}</a></li>'.format(self.query_dic_url_param.urlencode(), num) html_list.append(li_html) if self.current_page == self.total_num: next_li = '<li class="disabled"><a> > </a></li>' else: # 为URL设置page参数, 重新拼接设置参数后的URL self.query_dic_url_param.setlist('page', [self.current_page + 1]) next_li = '<li><a href="?{}"> > </a></li>'.format(self.query_dic_url_param.urlencode()) html_list.append(next_li) if self.current_page == self.total_num: last_li = '<li class="disabled"><a>末页</a></li>' else: # 为URL设置page参数, 重新拼接设置参数后的URL self.query_dic_url_param.setlist('page', [self.total_num]) last_li = '<li><a href="?{}">末页</a></li>'.format(self.query_dic_url_param.urlencode()) html_list.append(last_li) return mark_safe(''.join(html_list))
views.py文件
def number_info(request): if request.method == 'GET': # 根据搜索条件筛选数据 data_list = models.PrettyNumber.objects.all() # 实例化分页对象 pages = Pagination(request, data_list.count()) total_page = pages.total_num current_page = pages.current_page data_list = data_list[pages.start: pages.end] html_str = pages.show_li return render(request, 'number_info.html', locals())
number_info.html文件
{# 分页器 #} <div> <nav aria-label="Page navigation"> <!-- 页码条 --> <ul class="pagination"> <!-- 将后端返回的html_str渲染展示到页面 --> {{ html_str }} </ul> <!-- 页码跳转 --> <li class="pagination" style="float: right"> <form method="get" style="float:right"> <input type="text" class="form-control" name="page" placeholder="页码" style="float:left; width:60px; ; border-radius: 0"> <button style="border-radius:0; background-color:#46464624" class="btn btn-default" type="submit"><i class="fa fa-angle-double-right" aria-hidden="true"></i></button> </form> </li> <!-- 页码数量 --> <p style="float: right;margin: 27px 7px;"> <span>第{{ current_page }}页/共{{ total_page }}页</span> </p> </nav> </div>
最终显示效果如下
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10072136.html
作者:cnblogs用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人