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

Django框架 Pagination分页实现代码实例

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

一、自定义分页

1、基础版自定义分页

data = [] for i in range(1, 302):  tmp = {"id": i, "name": "alex-{}".format(i)}  data.append(tmp) print(data)def user_list(request):   # user_list = data[0:10]  # user_list = data[10:20]  try:    current_page = int(request.GET.get("page"))  except Exception as e:    current_page = 1   per_page = 10   # 数据总条数  total_count = len(data)  # 总页码  total_page, more = divmod(total_count, per_page)  if more:    total_page += 1   # 页面最多显示多少个页码  max_show = 11  half_show = int((max_show-1)/2)   if current_page <= half_show:    show_start = 1    show_end = max_show  else:    if current_page + half_show >= total_page:      show_start = total_page - max_show      show_end = total_page    else:      show_start = current_page - half_show      show_end = current_page + half_show   # 数据库中获取数据  data_start = (current_page - 1) * per_page  data_end = current_page * per_page   user_list = data[data_start:data_end]   # 生成页面上显示的页码  page_html_list = []  # 加首页  first_li = '<li><a href="https:user_list/?page=1" rel="external nofollow" >首页</a></li>'  page_html_list.append(first_li)  # 加上一页  if current_page == 1:    prev_li = '<li><a href="" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'  else:    prev_li = '<li><a href="https:user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(current_page - 1)  page_html_list.append(prev_li)  for i in range(show_start, show_end+1):    if i == current_page:      li_tag = '<li class="active"><a href="https:user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)    else:      li_tag = '<li><a href="https:user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)    page_html_list.append(li_tag)   # 加下一页  if current_page == total_page:    next_li = '<li><a href="" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'  else:    next_li = '<li><a href="https:user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(current_page+1)  page_html_list.append(next_li)   # 加尾页  page_end_li = '<li><a href="https:user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page)  page_html_list.append(page_end_li)   page_html = "".join(page_html_list)   return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

2、封装保存版

class Pagination(object):  def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):    """    :param current_page: 当前页    :param total_count: 数据库中数据总数    :param per_page: 每页显示多少条数据    :param max_show: 最多显示多少页    """    try:      current_page = int(current_page)    except Exception as e:      current_page = 1     self.current_page = current_page    self.total_count = total_count    self.base_url = base_url    self.per_page = per_page    self.max_show = max_show     # 总页码    total_page, more = divmod(total_count, per_page)    if more:      total_page += 1         half_show = int((max_show - 1) / 2)    self.half_show = half_show    self.total_page = total_page   @property  def start(self):    return (self.current_page - 1) * self.per_page   @property  def end(self):    return self.current_page * self.per_page   def page_html(self):     if self.current_page <= self.half_show:      show_start = 1      show_end = self.max_show    else:      if self.current_page + self.half_show >= self.total_page:        show_start = self.total_page - self.max_show        show_end = self.total_page      else:        show_start = self.current_page - self.half_show        show_end = self.current_page + self.half_show         # 生成页面上显示的页码    page_html_list = []    # 加首页    first_li = '<li><a href="https:/article/{}?page=1" rel="external nofollow" >首页</a></li>'.format(self.base_url)    page_html_list.append(first_li)    # 加上一页    if self.current_page == 1:      prev_li = '<li><a href="" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'    else:      prev_li = '<li><a href="https:/article/{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(self.base_url, self.current_page - 1)    page_html_list.append(prev_li)    for i in range(show_start, show_end + 1):      if i == self.current_page:        li_tag = '<li class="active"><a href="https:/article/{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)      else:        li_tag = '<li><a href="https:/article/{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)      page_html_list.append(li_tag)     # 加下一页    if self.current_page == self.total_page:      next_li = '<li><a href="" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'    else:      next_li = '<li><a href="https:/article/{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(self.base_url, self.current_page + 1)    page_html_list.append(next_li)     # 加尾页    page_end_li = '<li><a href="https:/article/{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(self.base_url, self.total_page)    page_html_list.append(page_end_li)     return "".join(page_html_list)

3、封装保存版使用指南

def user_list(request):  pager = Pagination(request.GET.get("page"), len(data), request.path_info)  user_list = data[pager.start:pager.end]  page_html = pager.page_html()  return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

二、Django内置分页

1、内置分页view部分

from django.shortcuts import renderfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []for i in range(999):  L.append(i)def index(request):  current_page = request.GET.get('p')  paginator = Paginator(L, 10)  # per_page: 每页显示条目数量  # count:  数据总个数  # num_pages:总页数  # page_range:总页数的索引范围,如: (1,10),(1,200)  # page:   page对象  try:    posts = paginator.page(current_page)    # has_next       是否有下一页    # next_page_number   下一页页码    # has_previous     是否有上一页    # previous_page_number 上一页页码    # object_list      分页之后的数据列表    # number        当前页    # paginator       paginator对象  except PageNotAnInteger:    posts = paginator.page(1)  except EmptyPage:    posts = paginator.page(paginator.num_pages)  return render(request, 'index.html', {'posts': posts}) 

2、内置分页HTML部分

<!DOCTYPE html><html><head lang="en">  <meta charset="UTF-8">  <title></title></head><body><ul>  {% for item in posts %}    <li>{{ item }}</li>  {% endfor %}</ul> <div class="pagination">   <span class="step-links">    {% if posts.has_previous %}      <a href="https:/article/?p={{ posts.previous_page_number }}" rel="external nofollow" >Previous</a>    {% endif %}     <span class="current">      Page {{ posts.number }} of {{ posts.paginator.num_pages }}.     </span>     {% if posts.has_next %}       <a href="https:/article/?p={{ posts.next_page_number }}" rel="external nofollow" >Next</a>     {% endif %}   </span></div></body></html>

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


  • 上一条:
    Django框架 查询Extra功能实现解析
    下一条:
    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语言中使用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个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(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交流群

    侯体宗的博客