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实现的HTTP并发测试完整示例
Apr 23 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
python读取和保存视频文件
Apr 16 Python
python实现批量图片格式转换
Jun 16 Python
Python for循环中的陷阱详解
Jul 13 Python
Django model反向关联名称的方法
Dec 15 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
python xpath获取页面注释的方法
Jan 14 Python
python属于解释型语言么
Jun 15 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
Python3 用什么IDE开发工具比较好
Nov 28 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
Protoss魔法科技
2020/03/14 星际争霸
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
ext 代码生成器
2009/08/07 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
python处理html转义字符的方法详解
2016/07/01 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Django中信号signals的简单使用方法
2019/07/04 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python队列原理及实现方法示例
2019/11/27 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
大学生社会实践自我鉴定
2014/03/24 职场文书
小班评语大全
2014/05/04 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
农村党员一句话承诺
2014/05/30 职场文书
感恩教育月活动总结
2014/07/07 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
2015年环保局工作总结
2015/05/22 职场文书
美丽的大脚观后感
2015/06/03 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书