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爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
Python实现购物车购物小程序
Apr 18 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python中的枚举类型示例介绍
Jan 09 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python 表格打印代码实例解析
Oct 12 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
python中68个内置函数的总结与介绍
Feb 24 Python
python实现一个猜拳游戏
Apr 05 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
python基础之文件操作
Oct 24 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
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue生命周期实例小结
2018/08/15 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
Openlayers绘制地图标注
2020/09/28 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
python递归计算N!的方法
2015/05/05 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
精细化工应届生求职信
2013/11/17 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
大学校庆邀请函
2014/01/11 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
计生个人工作总结
2015/02/28 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书