侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

框架(架构)  /  管理员 发布于 7年前   280

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="https:/article/?cur_page=1" rel="external nofollow" ><<</a></li>   <li>    <a href="https:/article/?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="https:/article/?cur_page={{ page_item }}" rel="external nofollow" rel="external nofollow" >{{ page_item }}</a></li>   {% else %}     <li><a href="https:/article/?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="https:/article/?cur_page={{ pagination.next_page }}" rel="external nofollow" aria-label="Next">     <span aria-hidden="true">»</span>    </a>   </li>   <li><a href="https:/article/?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的信号机制详解
    下一条:
    浅谈django model的get和filter方法的区别(必看篇)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客