django 函数和类实现分页案例
方法一: 模拟分页
from django.shortcuts import render,HttpResponse
from app01 import models def hostnames(request):
current_page = int(request.GET.get('page')) #获取当前页数
per_page = 10 #定义每页显示的页数
all_data = models.Host.objects.all().count() #统计数据库数据条数
all_page,b = divmod(all_data,per_page) #获取分多少页显示
if b != 0:
all_page += 1
start_page = (current_page-1) * per_page #定义从哪儿开始
end_page = current_page * per_page #定义从哪儿结束
host_list = models.Host.objects.all()[start_page:end_page] 从数据获取展示的数据 page_count = 11
half_page_count = int(page_count /2)
if all_page < page_count:
page_start = 1
page_end = page_count
else:
if current_page <= half_page_count:
page_start = 1
page_end = page_count
else:
if (current_page+5) > all_page:
page_end = all_page
page_start = all_page-page_count
else:
page_start = current_page -half_page_count
page_end = current_page + half_page_count url_list = []
if current_page <= 1:
prev = '<a href="#">上一页</a>'
else:
prev = '<a href="/hostnames/?page=%s">上一页</a>'%(current_page-1)
url_list.append(prev)
for i in range(page_start,page_end+1):
if current_page == i:
tp = '<a class="active href="/hostnames/?page=%s">%s</a>' % (i, i) else:
tp = '<a href="/hostnames/?page=%s">%s</a>' %(i,i)
url_list.append(tp) if current_page >= all_page:
next = '<a href="#">下一页</a>'
else:
next = '<a href="/hostnames/?page=%s">下一页</a>'%(current_page+1)
url_list.append(next)
page_str = "".join(url_list)
print(page_str)
return render(request,'hostnames.html',{'host_list':host_list,'page_str':page_str})
模拟分页结合bootstrape设置样式
后端代码
# 分页
users = [ {'username':'ivy_{}'.format(i),'pwd':'xxx'} for i in range(1,406)]
def user_list(request):
try:
page = int(request.GET.get('page',1))
if page <= 0:
page = 1
except Exception:
page = 1
#每页显示的数据条数
per_num = 10
#总数据量
all_count = len(users) #计算总页数
all_page,more = divmod(all_count,per_num)
if more:
all_page+=1
#最多显示的页码数
max_show = 11
half_show = max_show//2 if all_page < max_show:
page_start = 1
page_end = all_page
else:
if page <= half_show:
page_start =1
page_end = max_show
elif page + half_show > all_page:
page_start = all_page - 11 +1
page_end = all_page
else:
page_start = page - half_show
page_end = page + half_show li_list = []
#上一页
if page ==1:
li = '<li class="disabled"><a href="?page={}">上一页</a></li>'.format(page)
li_list.append(li)
else:
li = '<li><a href="?page={}">上一页</a></li>'.format(page-1)
li_list.append(li)
for i in range(page_start,page_end+1):
if i == page:
li = '<li class="active"><a href="?page={}">{}</a></li>'.format(i,i)
else:
li = '<li><a href="?page={}">{}</a></li>'.format(i, i)
li_list.append(li)
# 下一页
if page == all_page:
li = '<li class="disabled"><a href="?page={}">下一页</a></li>'.format(page)
li_list.append(li)
else:
li = '<li><a href="?page={}">下一页</a></li>'.format(page + 1)
li_list.append(li)
page_html = ''.join(li_list) start = (page-1)*per_num
end = page * per_num
return render(request,'user_list.html',{'users':users[start:end],'page_html':page_html}) 模板文件代码:
{% extends 'layout.html' %}
{% block content %}
<table class="table">
<thead>
<tr>
<th>
用户名
</th>
<th>
密码
</th>
</tr> </thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.username }}</td>
<td>{{ user.pwd }}</td>
</tr>
{% endfor %} </tbody>
</table> <nav aria-label="Page navigation">
<ul class="pagination">
{{ page_html | safe }}
<form action="">
<input type="number" name="page">
<button>跳转</button> </form> </ul>
</nav>
{% endblock %}
类封装和使用
封装代码 from django.utils.safestring import mark_safe
class Pagination():
def __init__(self,page,all_count,per_num=10,max_show=11):
try:
self.page = int(page)
if self.page <= 0:
self.page = 1
except Exception:
self.page = 1
# 每页显示的数据条数
per_num = per_num
# 总数据量
all_count = all_count # 计算总页数
self.all_page, more = divmod(all_count, per_num)
if more:
self.all_page += 1
# 最多显示的页码数
max_show = max_show
half_show = max_show // 2 if self.all_page < max_show:
page_start = 1
page_end = self.all_page
else:
if self.page <= half_show:
page_start = 1
page_end = max_show
elif self.page + half_show > self.all_page:
page_start = self.all_page - 11 + 1
page_end = self.all_page
else:
page_start =self.page - half_show
page_end = self.page + half_show self.page_start = page_start
self.page_end = page_end
# 切片起始位置
self.start = (self.page - 1) * per_num
# 切片结束位置
self.end = self.page * per_num @property
def page_html(self):
li_list = []
# 上一页
if self.page == 1:
li = '<li class="disabled"><a href="?page={}">上一页</a></li>'.format(self.page)
li_list.append(li)
else:
li = '<li><a href="?page={}">上一页</a></li>'.format(self.page - 1)
li_list.append(li)
for i in range(self.page_start, self.page_end + 1):
if i == self.page:
li = '<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)
else:
li = '<li><a href="?page={}">{}</a></li>'.format(i, i)
li_list.append(li)
# 下一页
if self.page == self.all_page:
li = '<li class="disabled"><a href="?page={}">下一页</a></li>'.format(self.page)
li_list.append(li)
else:
li = '<li><a href="?page={}">下一页</a></li>'.format(self.page + 1)
li_list.append(li) s = ' <nav aria-label="Page navigation"><ul class="pagination">{}</ul></nav>'.format(''.join(li_list))
return mark_safe(s) 调用代码
# 分页
users = [ {'username':'ivy_{}'.format(i),'pwd':'xxx'} for i in range(1,406)]
from utils import pagination
def user_list(request):
page_obj = pagination.Pagination(request.GET.get('page'),len(users)) return render(request,'user_list.html',
{'users':users[page_obj.start:page_obj.end],'page_html':page_obj.page_html}) 模板文件代码
{% extends 'layout.html' %}
{% block content %}
<table class="table">
<thead>
<tr>
<th>
用户名
</th>
<th>
密码
</th>
</tr> </thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.username }}</td>
<td>{{ user.pwd }}</td>
</tr>
{% endfor %} </tbody>
</table> {{ page_html }}
{% endblock %} {#跳转代码#}
{# <form action="">#}
{# <input type="number" name="page">#}
{# <button>跳转</button>#}
{##}
{# </form>#}
django 函数和类实现分页案例的更多相关文章
- django framework插件类视图分页
分页 继承APIView类的视图中添加分页 from rest_framework.pagination import PageNumberPagination class MyPageNumberP ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- django rest-framework 3.类 实现restful
上节提到过,REST框架分别提供了对函数和类的装饰器,之前已经都是通过函数来写视图函数的,现在来尝试使用class 类来实现视图函数 使用基于类编写API视图,允许重用常用的功能,减少代码重复. 一. ...
- tornado 模版继承 函数和类的调用
模版继承.函数和类的调用 目录结构 lesson5.py # -*- coding:utf-8 -*- import tornado.web import tornado.httpserver imp ...
- django的rest framework框架——分页、视图、路由、渲染器
一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url f ...
- Django视图基类
Django视图基类 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 一 .视图 REST framework 提供 ...
- Django视图扩展类
Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...
- Python中函数、类、模块和包的调用
初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...
- DLL导出函数和类的定义区别 __declspec(dllexport)
DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...
随机推荐
- 周志华-机器学习西瓜书-第三章习题3.5 LDA
本文为周志华机器学习西瓜书第三章课后习题3.5答案,编程实现线性判别分析LDA,数据集为书本第89页的数据 首先介绍LDA算法流程: LDA的一个手工计算数学实例: 课后习题的代码: # coding ...
- Mysql5.6.45配置安装
##1.1简介 因为之前电脑比较卡,自己重装了个系统,麻烦的就是装一些编程软件,但是自己吃饭的家伙也要会装啊,为了以后更方便的安装,自己总结一下步骤,进入正题 ##1.2资源下载 官方网站链接: ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_15.RabbitMQ研究-与springboot整合-声明交换机和队列
复制topic的代码 把常量都设置成public方便其他的类引用 ExchangeBuilder里面有4个方法分别对应四个交换机. 声明Email和短信的队列 队列绑定交换机 所以需要把Bean注入到 ...
- 一步一步搭建Nuget私服
大致流程:1. 通过VS创建一个Web空项目,然后通过Nuget引入Nuget.Server(目前最新版3.2.1).2. 直接将这个Web项目发布到IIS.3. 通过nuget.exe打包*.nup ...
- 在DELPHI中用TreeView控件从数据库中动态装载信息
1.PInfo表结构ID VARCHAR(50)FullName VARCHAR(50)ParentID VARCHAR(50) 2.Unit文件unit Info; interface uses ...
- 超详细的EM算法理解
众所周知,极大似然估计是一种应用很广泛的参数估计方法.例如我手头有一些东北人的身高的数据,又知道身高的概率模型是高斯分布,那么利用极大化似然函数的方法可以估计出高斯分布的两个参数,均值和方差.这个方法 ...
- java工具类学习,系统中用户密码加密总结
现在项目,用户注册登录部分很少有涉及到了,原因:现在热门开发框架都已经在底层帮我们做了一套用户注册,密码加密,登录认证,权限控制,缓存数据等基本功能. 这有利于项目的快速完成,只需要搬砖码畜们专注于业 ...
- MATLAB 2016b + CUDA10.1 +MatConvNet beta25 安装踩坑记
最近因为目标跟踪实验需要得安装MatConvNet,由于已经是2019年了大家的软件版本肯定不可能是像官网要求的那样,所以安装自然而然就会碰到很多问题.在这一过程中我参考了网上很多博主的经验,有些确实 ...
- 对ysoserial工具及java反序列化的一个阶段性理解【未完成】
经过一段时间的琢磨与反思,以及重读了大量之前看不懂的反序列化文章,目前为止算是对java反序列化这块有了一个阶段性的小理解. 目前为止,发送的所有java反序列化的漏洞中.主要需要两个触发条件: 1. ...
- Navicate 许可证
参考: https://blog.csdn.net/weixin_42129270/article/details/81182261