Django自定义分页与bootstrap分页结合


Posted in Python onFebruary 22, 2021

django中有自带的分页模块Paginator,想Paginator提供对象的列表,就可以提供每一页上对象的方法。

这里的话不讲解Paginator,而是自定义一个分页类来完成需求:

class Pagination(object): 
 """用于Model字段值的选择""" 
 
 def __init__(self): 
  pass 
 
 @classmethod 
 def create_pagination(self, from_name='', model_name='', 
       cur_page=1, start_page_omit_symbol = '...', 
       end_page_omit_symbol = '...', one_page_data_size=10, 
       show_page_item_len=9): 
  """通过给的model和分页参数对相关model进行分页 
  Args: 
   from_name: 导入模块的 from后面的参数 
    from {from_name} import model_name 
   mode_name: 需要导入的模块名 
    from from_name import {model_name} 
   cur_page: 当前显示的是第几页 
   start_page_omit_symbol: 超出的页数使用怎么样的省略号(前) 
    ... 2 3 4 
   end_page_omit_symbol: 超出的页数使用怎么样的省略号(后) 
    1 2 3 4 ... 
   one_page_data_size: 每一页显示几行 
   show_page_item_len: 显示几个能点击的页数 
  Return: 
   pagination: dict 
     pagination = { 
      'objs': objs, # 需要显示model数据 
      'all_obj_counts': all_obj_counts, # 一共多少行数据 
      'start_pos': start_pos, # 数据分页开始的数据 
      'end_pos': end_pos, # 数据分页结束的数据 
      'all_page': all_page, # 一共有多少页 
      'cur_page': cur_page, # 当前的页码 
      'pre_page': pre_page, # 上一页的页码 
      'next_page': next_page, # 下一页的页码 
      'page_items': page_items, 能点击的页数 
      'start_page_omit_symbol': start_page_omit_symbol, # 开始的省略号 
      'end_page_omit_symbol': end_page_omit_symbol, # 结束的省略号 
     } 
  Raise: None 
  """ 
  # 如果没有输入导入模块需要的相关信息直接退出 
  if not from_name or not model_name: 
   return None 
 
  import_str = 'from {from_name} import {model_name}'.format( 
           from_name = from_name, 
           model_name = model_name) 
  # 导入模块 
  exec import_str 
 
  start_pos = (cur_page - 1) * one_page_data_size 
  end_pos = start_pos + one_page_data_size 
 
  # 查找需要的model数据 
  find_objs_str = ('{model_name}.objects.all()' 
       '[{start_pos}:{end_pos}]'.format( 
            model_name = model_name, 
            start_pos = start_pos, 
            end_pos = end_pos)) 
  objs = eval(find_objs_str) 
  
  # 计算总共的页数 
  find_objs_count_str = '{model_name}.objects.count()'.format( 
            model_name = model_name) 
  all_obj_counts = eval(find_objs_count_str) 
  all_page = all_obj_counts / one_page_data_size 
  remain_obj = all_obj_counts % one_page_data_size 
  if remain_obj > 0: 
   all_page += 1 
 
  # 限制当前页不能小于1和并且大于总页数 
  cur_page = 1 if cur_page < 1 else cur_page 
  cur_page = all_page if cur_page > all_page else cur_page 
 
  # 获得显示页数的最小页 
  start_page = cur_page - show_page_item_len / 2 
  if start_page > all_page - show_page_item_len: 
   start_page = all_page - show_page_item_len + 1 
  start_page = 1 if start_page < 1 else start_page 
 
  # 获得显示页数的最大页 
  end_page = cur_page + show_page_item_len / 2 
  end_page = all_page if end_page > all_page else end_page 
  if end_page < show_page_item_len and all_page > show_page_item_len: 
   end_page = show_page_item_len 
 
  # 获得上一页 
  pre_page = cur_page - 1 
  pre_page = 1 if pre_page < 1 else pre_page 
 
  # 获得下一页 
  next_page = cur_page + 1 
  next_page = all_page if next_page > all_page else next_page 
 
  # 处理省略符,是否显示 
  if start_page <= 1: 
   start_page_omit_symbol = '' 
   
  if end_page >= all_page: 
   end_page_omit_symbol = '' 
 
  # 创建能点击的展示页码 
  page_items = range(start_page, end_page + 1) 
 
  pagination = { 
   'objs': objs, 
   'all_obj_counts': all_obj_counts, 
   'start_pos': start_pos, 
   'end_pos': end_pos, 
   'all_page': all_page, 
   'cur_page': cur_page, 
   'pre_page': pre_page, 
   'next_page': next_page, 
   'page_items': page_items, 
   'start_page_omit_symbol': start_page_omit_symbol, 
   'end_page_omit_symbol': end_page_omit_symbol, 
  } 
 
  return pagination

利用bootstrap的css,生成好看的html如下:

<nav aria-label="Page navigation"> 
 <ul class="pagination"> 
 {% if pagination.cur_page != 1 %} 
 <li><a href="?cur_page=1" rel="external nofollow" ><<</a></li> 
 <li> 
  <a href="?cur_page={{ pagination.pre_page }}" rel="external nofollow" aria-label="Previous"> 
  <span aria-hidden="true">«</span> 
  </a> 
 </li> 
 {% endif %} 
 {% for page_item in pagination.page_items %} 
 {% if page_item == pagination.cur_page %} 
  <li><a href="?cur_page={{ page_item }}" rel="external nofollow" rel="external nofollow" >{{ page_item }}</a></li> 
 {% else %} 
  <li><a href="?cur_page={{ page_item }}" rel="external nofollow" rel="external nofollow" >{{ page_item }}</a></li> 
 {% endif %} 
 {% endfor%} 
 {% if pagination.cur_page != pagination.all_page %} 
 <li> 
  <a href="?cur_page={{ pagination.next_page }}" rel="external nofollow" aria-label="Next"> 
  <span aria-hidden="true">»</span> 
  </a> 
 </li> 
 <li><a href="?cur_page={{ pagination.all_page }}" rel="external nofollow" >>></a></li> 
 {% endif %} 
 </ul> 
</nav>

view函数如下:

def blogpage(request): 
  #ojt = BlogPost.object.all() 
  #p = Paginator(ojt,2) 
  #page_count = p.count 
  #page_data = p.page(page) 
  #template = 'blogpage.html' 
  #info = {'page_data':page_data,'page_count':page_count} 
  #return render(request,template,{'page_data':page_data,'page_count':page_count}) 
  try: 
    cur_page = int(request.GET.get('cur_page', '1')) 
  except ValueError: 
    cur_page = 1 
 
  pagination = Pagination.create_pagination( 
       from_name='blog.models', 
       model_name='BlogPost', 
       cur_page=cur_page, 
       start_page_omit_symbol = '...', 
       end_page_omit_symbol = '...', 
       one_page_data_size=1, 
       show_page_item_len=5) 
  return render(request, 'blogpage.html',{'pagination':pagination})

效果图如下:

Django自定义分页与bootstrap分页结合

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python httplib,smtplib使用方法
Sep 06 Python
python实现网页链接提取的方法分享
Feb 25 Python
在Django的视图中使用form对象的方法
Jul 18 Python
Python处理JSON数据并生成条形图
Aug 05 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
利用python写个下载teahour音频的小脚本
May 08 #Python
通过源码分析Python中的切片赋值
May 08 #Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 #Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 #Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 #Python
利用Celery实现Django博客PV统计功能详解
May 08 #Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 #Python
You might like
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
怎样在UNIX系统下安装php3
2006/10/09 PHP
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
php str_replace的替换漏洞
2008/03/15 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
pytorch中的inference使用实例
2020/02/20 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
酒后驾车标语
2014/06/30 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
暑期学习心得体会
2014/09/02 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python