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


Posted in Python onSeptember 04, 2019

一、自定义分页

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="/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="/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="/user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
    else:
      li_tag = '<li><a href="/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="/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="/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="{}?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="{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="{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="{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="{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="{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 render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
L = []
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="?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="?p={{ posts.next_page_number }}" rel="external nofollow" >Next</a>
     {% endif %}
   </span>
</div>
</body>
</html>

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

Python 相关文章推荐
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python使用sorted排序的方法小结
Jul 28 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
python线程池threadpool实现篇
Apr 27 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
Python多进程原理与用法分析
Aug 21 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
django自带调试服务器的使用详解
Aug 29 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
python 动态迁移solr数据过程解析
Sep 04 #Python
Django框架 信号调度原理解析
Sep 04 #Python
Django Admin中增加导出Excel功能过程解析
Sep 04 #Python
Django Admin中增加导出CSV功能过程解析
Sep 04 #Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 #Python
通过Python编写一个简单登录功能过程解析
Sep 04 #Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 #Python
You might like
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
python使用建议技巧分享(三)
2020/08/18 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
团员个人的自我评价
2013/12/02 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
接受捐赠答谢词
2014/01/27 职场文书
小区推广策划方案
2014/06/06 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android