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通过正则查找微博@(at)用户的方法
Mar 13 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
python 读取txt中每行数据,并且保存到excel中的实例
Apr 29 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
基于python的Paxos算法实现
Jul 03 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
Python装饰器用法与知识点小结
Mar 09 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
Python如何定义有默认参数的函数
Aug 10 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP array 的加法操作代码
2010/07/24 PHP
php事务处理实例详解
2014/07/11 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
javascript实现类似超链接的效果
2014/12/26 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
Vue动态创建注册component的实例代码
2019/06/14 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
玩转python爬虫之cookie使用方法
2016/02/17 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
python 爬虫请求模块requests详解
2020/12/04 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
IRO美国官网:法国服装品牌
2018/03/06 全球购物
消防标语大全
2014/06/07 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
Python torch.flatten()函数案例详解
2021/08/30 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS