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

Django自定义分页效果

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

分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。

确定分页需求:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

效果图:

首先,利用django内置的分页功能,写分页类:

from django.core.paginator import Paginator, Page  # 导入django分页模块class PageInfo(object): def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11):  """  :param current_page: 当前页  :param all_count: 总页数  :param base_url: 模板  :param per_page: 每页显示数据条数  :param show_page: 显示链接页个数  """  #若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)  try:   self.current_page = int(current_page)  except Exception as e:   self.current_page = 1    #根据数据库信息条数得出总页数     a, b = divmod(all_count, per_page)  if b:   a += 1  self.all_page = a     self.base_url = base_url  self.per_page = per_page  self.show_page = show_page #当前页起始数据id def start_data(self):    return (self.current_page - 1) * self.per_page #当前页结束数据id def end_data(self):    return self.current_page * self.per_page  #动态生成前端html def pager(self):  page_list = []  half = int((self.show_page - 1)/2)  #如果:总页数 < show_page,默认显示页数范围为: 1~总页数  if self.all_page < self.show_page:   start_page = 1   end_page = self.all_page + 1  #如果:总页数 > show_page  else:   #如果:current_page - half <= 0,默认显示页数范围为:1~show_page   if self.current_page <= half:    start_page = 1    end_page = self.show_page + 1   else:    #如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数    if self.current_page + half > self.all_page:     end_page = self.all_page + 1     start_page = end_page - self.show_page    else:     start_page = self.current_page - half     end_page = self.current_page + half + 1  #首页  first_page = "<li><a href='https:/article/%s?page=%s'>首页</a></li>" %(self.base_url, 1)  page_list.append(first_page)  #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)  if self.current_page <= 1:   prev_page = "<li><a href=''>上一页</a></li>"  else:   prev_page = "<li><a href='https:/article/%s?page=%s'>上一页</a></li>" %(self.base_url, self.current_page-1)  page_list.append(prev_page)  #动态生成中间页数链接  for i in range(start_page, end_page):   if i == self.current_page:    temp = "<li class='active'><a href='https:/article/%s?page=%s'>%s</a></li>" %(self.base_url, i, i)   else:    temp = "<li><a href='https:/article/%s?page=%s'>%s</a></li>" % (self.base_url, i, i)   page_list.append(temp)  #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)  if self.current_page >= self.all_page:   next_page = "<li><a href=''>下一页</a></li>"  else:   next_page = "<li><a href='https:/article/%s?page=%s'>下一页</a></li>" %(self.base_url, self.current_page+1)  page_list.append(next_page)  #末页(若总页数只有一页,则无末页标签)  if self.all_page > 1:   last_page = "<li><a href='https:/article/%s?page=%s'>末页</a></li>" % (self.base_url, self.all_page)   page_list.append(last_page)  return ''.join(page_list)

然后,在views中写方法(此处写在app01中):

from utils.pagnition import PageInfo # 从文件中导入上步自定义的分页模块def custom(request): all_count = models.UserInfo.objects.all().count()  # 获取要显示数据库的总数据条数 page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',)   # 生成分页对象 user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()]   # 利用分页对象获取当前页显示数据 return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info})  # 模板渲染

然后,在templates目录下写“custom.html"文件:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>customers</title>{# 引入bootstrap样式#} <link rel="stylesheet" href="https:static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css"></head><body><h1>customers</h1>{#当前页显示的数据#}<ul> {% for row in user_list %}  <li>{{ row.name }}</li> {% endfor %}</ul>{#分页#} <nav aria-label="Page navigation">  <ul class="pagination">{#    传入page_info.pager#}   {{ page_info.pager|safe }}  </ul> </nav></body></html>

最后,新增url关系(urls.py):

 from django.conf.urls import url from django.contrib import admin from app01 import views as app01_views  urlpatterns = [  url(r'^custom.html/$', app01_views.custom), ]

至此,就完成了利用django的分页功能自定义分页模块,可以应用在不同的业务页面上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Django objects.all()、objects.get()与objects.filter()之间的区别介绍
    下一条:
    Django自定义认证方式用法示例
  • 昵称:

    邮箱:

    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交流群

    侯体宗的博客