新建 utils 文件夹,并创建 page.py

page.py:

class ShowPage(object):
def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
'''
:param page_num: 当前页码数
:param total_count: 数据总数
:param url_prefix: a 标签 href 的前缀
:param per_page: 每页展示的数据数
:param max_page: 页面上最多显示的页码数
'''
self.url_prefix = url_prefix
self.max_page = max_page # 总共需要多少页码来显示
total_page, m = divmod(total_count, per_page) # 如果还有数据
if m:
total_page += 1
self.total_page = total_page try:
page_num = int(page_num)
# 如果输入的页码数超过了最大的页码数,默认返回最后一页
if page_num > self.total_page:
page_num = self.total_page
# 如果输入的页码数小于 1,则返回第一页
if page_num < 1:
page_num = 1
except Exception as e:
# 当输入的页码不是正经数字的时候 默认返回第一页的数据
page_num = 1
self.page_num = page_num # 定义两个变量保存数据从哪儿取到哪儿
self.data_start = (self.page_num - 1) * 10
self.data_end = self.page_num * 10 # 页面上总共展示多少页码
if self.total_page < self.max_page:
self.max_page = self.total_page half_max_page = self.max_page // 2 # 页面上展示的页码的开始页
page_start = self.page_num - half_max_page
# 页面上展示的页码的结束页
page_end = self.page_num + half_max_page
# 如果当前页减一半比 1 还小
if page_start <= 1:
page_start = 1
page_end = self.max_page
# 如果当前页加一半比总页码还大
if page_end >= self.total_page:
page_end = self.total_page
page_start = self.total_page - self.max_page + 1
self.page_start = page_start
self.page_end = page_end @property
def start(self):
return self.data_start @property
def end(self):
return self.data_end def page_html(self):
# 拼接 html 的分页代码
html_list = [] # 添加首页按钮
html_list.append('<li><a href="{}?page=1">首页</a></li>'.format( self.url_prefix)) # 如果是第一页,就没有上一页
if self.page_num <= 1:
html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1))
else:
# 加一个上一页的标签
html_list.append('<li><a href="{}?page={}"><span aria-hidden="true">«</span></a></li>'.format(self.url_prefix, self.page_num-1)) # 展示的页码
for i in range(self.page_start, self.page_end + 1):
# 给当前页添加 active
if i == self.page_num:
tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
else:
tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
html_list.append(tmp) # 如果是最后一页,就没有下一页
if self.page_num >= self.total_page:
html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>')
else:
html_list.append(
'<li><a href="{}?page={}"><span aria-hidden="true">»</span></a></li>'.format(self.url_prefix, self.page_num + 1)) # 添加尾页按钮
html_list.append('<li><a href="{}?page={}">尾页</a></li>'.format(self.url_prefix, self.total_page)) page_html = "".join(html_list) # 拼接 html 的分页代码
return page_html

views.py:

from django.shortcuts import render
from app01 import models def book_list(request):
# 从URL取参数
page_num = request.GET.get("page")
print(page_num, type(page_num)) # 书籍总数
total_count = models.Book.objects.all().count() # 导入显示页码的函数
from utils.page import ShowPage
page_obj = ShowPage(page_num, total_count, per_page=10, url_prefix="/book_list/", max_page=11, ) ret = models.Book.objects.all()[page_obj.start:page_obj.end]
print(ret) page_html = page_obj.page_html()
return render(request, "book_list.html", {"books": ret, "page_html": page_html})

book_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书籍列表</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body> <div class="container"> <table class="table table-bordered">
<thead>
<tr>
<th>序号</th>
<th>id</th>
<th>书名</th>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book.id }}</td>
<td>{{ book.title }}</td>
</tr>
{% endfor %} </tbody>
</table> <nav aria-label="Page navigation">
<ul class="pagination">
<li>
{{ page_html|safe }}
</li>
</ul>
</nav> </div> </body>
</html>

Python - Django - 封装分页成通用的模块的更多相关文章

  1. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  2. Linux下开发python django程序(设置admin后台管理模块)

    1.新建项目和项目下APP django-admin startproject csvt03 django-admin startapp app1 2.修改settings.py文件 设置默认安装AP ...

  3. Python - Django - 简单分页的实现

    models.py: from django.db import models class Book(models.Model): title = models.CharField(max_lengt ...

  4. Python Django CBV下的通用视图函数

    ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...

  5. 将Python脚本封装成exe可执行文件 转

    将Python脚本封装成exe可执行文件 http://www.cnblogs.com/renzo/archive/2012/01/01/2309260.html  cx_freeze是用来将 Pyt ...

  6. 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

    利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcode qr = ...

  7. python文件封装成*.exe

    python文件封装成*.exe文件(单文件和多文件) 环境:win10 64位 python3.7 原文: https://www.cnblogs.com/jackzz/p/9431923.html ...

  8. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  9. 把jQuery的类、插件封装成seajs的模块的方法

    这篇文章主要介绍了把jQuery的类.插件封装成seajs的模块的方法,需要的朋友可以参考下 注:本文使用的seajs版本是2.1.1 一.把Jquery封装成seajs的模块 define(func ...

随机推荐

  1. Python爬取网页信息

    Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初 ...

  2. Acwing P277 饼干 题解

    每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考 ...

  3. Kylin 1 背景、历史与使命

    1.1 背景和历史 今天,大数据领域的发展如火如荼,各种新技术层出不穷,整个生态欣欣向荣.作为大数据领域最重要的技术——Apache Hadoop,从诞生至今已有10周年.它最初只是致力于简单的分布式 ...

  4. asp.net文件夹上传下载组件

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  5. RabbitMQ后台管理界面

    打开后台界面:http://localhost:15672/#/   右上角可以设置页面"刷新时间".以及选择监听的"虚拟主机". 界面有"概要&qu ...

  6. VIM工具的常用命令快捷键

    一.光标的移动0: 移动到行首.$: 移动到行尾.w: walk移动到下一个单词b: back 移动到上一个单词h或退格: 左移一个字符:后退l或空格: 右移一个字符:前进j: 下移一行:k: 上移一 ...

  7. Chrome教程(一)NetWork面板分析网络请求

    官方文档:https://developers.google.com/web/tools/chrome-devtools/network/ 1.如何打开 无论是在Windows还是Mac,都可以使用( ...

  8. Pytest权威教程23-不稳定测试

    目录 不稳定测试用例处理 为什么不稳定测试是个问题 潜在的根本原因 Pytest特性 其他一般策略 相关研究 相关资源 返回: Pytest权威教程 不稳定测试用例处理 "不稳定" ...

  9. 比较实用的Java工具类

    一. org.apache.commons.io.IOUtils closeQuietly:关闭一个IO流.socket.或者selector且不抛出异常,通常放在finally块 toString: ...

  10. Java NIO?看这一篇就够了!

    现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty.学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能.在前面2篇文章< ...