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中的多重继承实例讲解
Sep 28 Python
Python类的多重继承问题深入分析
Nov 09 Python
Python的Flask框架中web表单的教程
Apr 20 Python
用python找出那些被“标记”的照片
Apr 20 Python
python difflib模块示例讲解
Sep 13 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
pytorch使用Variable实现线性回归
May 21 Python
python绘制地震散点图
Jun 18 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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 fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
php字符串截取函数用法分析
2014/11/25 PHP
php简单统计在线人数的方法
2016/05/10 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
JavaScript中Math对象使用说明
2008/01/16 Javascript
jQuery入门知识简介
2010/03/04 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
jquery操作select大全
2014/04/25 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
点球小游戏python脚本
2018/05/22 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
Python笔试面试题小结
2019/09/07 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
啦啦队口号大全
2014/06/16 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书