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 时间处理datetime实例
Sep 06 Python
python发布模块的步骤分享
Feb 21 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
Python求均值,方差,标准差的实例
Jun 29 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
python右对齐的实例方法
Jul 05 Python
python中super()函数的理解与基本使用
Aug 30 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采集速度探究总结(原创)
2008/04/18 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
python3.3实现乘法表示例
2014/02/07 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
神经网络python源码分享
2017/12/15 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
django框架ModelForm组件用法详解
2019/12/11 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
使用索引有什么好处
2016/07/27 面试题
给酒店员工的表扬信
2014/01/11 职场文书
安全生产大检查方案
2014/05/07 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL