Django中分页

py文件代码

"""
自定义分页组件
可以返回分页的数据和分页的HTML代码
"""
from django.http import QueryDict class Pagination(object): def __init__(self, current_page, total_count, url_prefix, query_dict=QueryDict(mutable=True), per_page=10,
show_page=9):
"""
初始化分分页器
:param url_prefix: a标签的URL前缀
:param current_page: 当前页码数
:param total_count: 数据总数
:param query_dict: 空的QueryDict()对象,并且是可修改的
:param per_page: 每一页显示多少数据, 默认值是10
:param show_page: 页面显示的页码数, 默认值是9
"""
# 0.分页的URL前缀
self.url_prefix = url_prefix
self.query_dict = query_dict
# 1. 每一页显示10条数据
self.per_page = per_page
assert per_page > 0
# 2. 计算需要多少页
total_page, more = divmod(total_count, per_page)
if more:
total_page += 1
self.total_page = total_page
# 3. 当前页码
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
current_page = total_page if current_page > total_page else current_page
# 页码必须是大于0的数
if current_page < 1:
current_page = 1 self.current_page = current_page
# 4. 页面最多显示的页码数
self.show_page = show_page
# 5. 最多显示页码的一半
self.half_show_page = self.show_page // 2 @property
def start(self):
# 数据切片的开始位置
return self.per_page * (self.current_page - 1) @property
def end(self):
# 数据切片的结束为止
return self.current_page * self.per_page # 定义一个返回HTML代码的方法
def page_html(self):
# 如果总页码数小于最大要显示的页码数
if self.total_page < self.show_page:
show_page_start = 1
show_page_end = self.total_page
# 左边越界
elif self.current_page - self.half_show_page < 1:
show_page_start = 1
show_page_end = self.show_page
# 右边越界
elif self.current_page + self.half_show_page > self.total_page:
show_page_end = self.total_page
show_page_start = self.total_page - self.show_page + 1
else:
show_page_start = self.current_page - self.half_show_page
# 页面显示页码的结束
show_page_end = self.current_page + self.half_show_page
# 生成分页的HTML代码
page_list = []
# 添加分页代码的前缀
page_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
# 添加首页
self.query_dict['page'] = 1
page_list.append(f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">首页</a></li>')
# 添加上一页
if self.current_page - 1 < 1: # 已经到头啦,不让点上一页啦
page_list.append(
'<li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>')
else:
self.query_dict['page'] = self.current_page - 1
page_list.append(
f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}" aria-label="Previous">'
f'<span aria-hidden="true">&laquo;</span></a></li>'
)
for i in range(show_page_start, show_page_end + 1):
self.query_dict['page'] = i
if i == self.current_page:
s = f'<li class="active"><a href="{self.url_prefix}?{self.query_dict.urlencode()}">{i}</a></li>'
else:
s = f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">{i}</a></li>'
page_list.append(s)
# 添加下一页
if self.current_page + 1 > self.total_page:
page_list.append(
'<li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
else:
self.query_dict['page'] = self.current_page + 1
page_list.append(
f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}" aria-label="Next">'
f'<span aria-hidden="true">&raquo;</span></a></li>'
)
# 添加尾页
self.query_dict['page'] = self.total_page
page_list.append(f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">尾页</a></li>')
# 添加分页代码的后缀
page_list.append('</ul></nav>')
page_html = ''.join(page_list)
return page_html

实例化对象

  1. def dashboard(request):
    # 获取当前网页路径
    url_prefix = request.path_info
    # 获取当前页码数
    current_page = request.GET.get('page', 1)
    # 获取所有客户的信息
    customer_list = Customer.objects.all()
    # 实例分页代码
    pagination = Pagination(current_page=current_page, total_count=customer_list.count(), url_prefix=url_prefix, per_page=8)
    # 获取当前页的数据
    data = customer_list[pagination.start:pagination.end]
    page_html = pagination.page_html()
    return render(request, "Dashboard.html", {'customer_list': data, "page_html": page_html})

前端代码

  1. <div>
    {{ page_html|safe }}
    </div>

使用django脚本去创建数据

  1. 批量创建数据

    1. 使用Django脚本去创建数据
    2. bulk_create()
  2. 分页
    1. 纯Python基础写的,
    2. django里面获取当前url
      1. request.path_info 获取当前路径
      2. request.get_full_path 获取全路径

实际样式

django之分页,纯python代码的更多相关文章

  1. pngCanvas 是一个使用纯Python代码的生成png图像的工具

    #!/usr/bin/env python """Simple PNG Canvas for Python - updated for bytearray()" ...

  2. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  3. 涨见识了,在终端执行 Python 代码的 6 种方式!

    原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...

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

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

  5. python代码自动补全配置及Django入门Demo

    django入门代码示例小博客:https://pan.baidu.com/s/1pLjLPSv 1.自动补全功能 许多人都知道 iPython 有很好的自动补全能力,但是就未必知道 python 也 ...

  6. Django 实现分页功能(django 2.2.7 python 3.7.5 )

    Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能.本文就讲解如何使用 Paginator 实现分页功能. 一. Paginator Paginator 类的作用是将我们需 ...

  7. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  8. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  9. Python代码混淆和加密技术

    Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. http: ...

随机推荐

  1. linux_16

    对常用I/O模型进行比较说明 nginx中的模块分类及常见核心模块有哪些 描述nginx中worker_processes.worker_cpu_affinity.worker_rlimit_nofi ...

  2. java+selenium自动化脚本编写

    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一.Se ...

  3. 配置多个ssh公钥,解决Key is already in use

    背景:我已经有一个ssh公钥和私钥了,绑定的是公司的码云 但是绑定github是不允许的 所以我需要在生成一个公钥和私钥 第一步执行下面的命令, 至于如果生成ssh公钥点击这里 ssh-keygen ...

  4. 02 HTML标签

    2. HTML标签 1. HTML简介 用户使用浏览器打开网页看到结果的过程就是:浏览器将服务端的文本文件(即网页文件)内容下载到本地,然后打开显示的过程. 而文本文件的文档结构只有空格和黄航两种组织 ...

  5. Linux常用命令在Ubuntu 16下(个人笔记)

    可以通过 tab键来补全提示命令或者目录,终端命令的格式: 命令 [-选项,多个选项可以结合写] [参数] , 大多数情况可以通过 ctrl c 退出命令 磁盘管理 pwd 查看当前所在目录 即:pr ...

  6. kubeasz 部署高可用 kubernetes 集群

    文章目录 环境准备 配置模板机 配置hosts解析 配置ssh 免密钥登陆 kubeasz 部署服务准备 配置主机清单 部署集群 环境准备 IP HOSTNAME SYSTEM 192.168.131 ...

  7. c++ struct enum union加typedef与不加typedef

    struct/enum/union加typedef与不加typedef 匿名结构体 struct { int a; int b; } v; // 这里表示定义了一个结构体的变量v,且结构体类型没有名字 ...

  8. java Doc的生成方式

    Java Doc Javadoc命令是用来生产自己API文档的 参数信息 @author作者名 @version 版本号 @since 指明需要最早使用的JDK版本 @param参数名 @return ...

  9. 使用SpringBoot整合MybatisPlus出现 : java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

    解决方案一: 将测试类的包路径改为和主启动类的一致 解决方法二: 不想改测试类的路径 就在测试类上添加要测试的类的classes

  10. jmeter重点(详细)

    之前,写过一篇文章:jmeter,学这些重点就可以了,今天就来把一些重点细节点说一下. 测试计划 可以理解为各种测试元件的容器 其中: 定义整个测试中使用的重复值(全局变量),一般定义服务器的ip.端 ...