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 Sql数据库增删改查操作简单封装
Apr 18 Python
Python中如何获取类属性的列表
Dec 26 Python
python运行其他程序的实现方法
Jul 14 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
Python内存读写操作示例
Jul 18 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
使用python实现kNN分类算法
Oct 16 Python
Django 限制访问频率的思路详解
Dec 24 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
Python中super().__init__()测试以及理解
Dec 06 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
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
了解一点js的Eval函数
2012/07/26 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
深入理解react 组件类型及使用场景
2019/03/07 Javascript
js验证密码强度解析
2020/03/18 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python在线运行代码助手
2016/07/15 Python
Python表示矩阵的方法分析
2017/05/26 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
Django如何将URL映射到视图
2019/07/29 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
python实现按关键字筛选日志文件
2019/12/24 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
傲盾软件面试题
2015/08/17 面试题
2014年办公室文员工作总结
2014/11/12 职场文书
初中毕业感言300字
2015/07/31 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP