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中的hashlib和base64加密模块使用实例
Sep 02 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
Python中处理时间的几种方法小结
Apr 09 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
如何基于Python实现自动扫雷
Jan 06 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
python 模拟登陆github的示例
Dec 04 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
Python数据可视化之绘制柱状图和条形图
May 25 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与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
浅析php创建者模式
2014/11/25 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
JS实现显示当前日期的实例代码
2018/07/03 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
班级活动策划书
2014/02/06 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
激励口号大全
2014/06/17 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
逃课检讨书范文
2015/05/06 职场文书