方法一: 模拟分页
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 函数和类实现分页案例的更多相关文章

  1. django framework插件类视图分页

    分页 继承APIView类的视图中添加分页 from rest_framework.pagination import PageNumberPagination class MyPageNumberP ...

  2. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  3. django rest-framework 3.类 实现restful

    上节提到过,REST框架分别提供了对函数和类的装饰器,之前已经都是通过函数来写视图函数的,现在来尝试使用class 类来实现视图函数 使用基于类编写API视图,允许重用常用的功能,减少代码重复. 一. ...

  4. tornado 模版继承 函数和类的调用

    模版继承.函数和类的调用 目录结构 lesson5.py # -*- coding:utf-8 -*- import tornado.web import tornado.httpserver imp ...

  5. django的rest framework框架——分页、视图、路由、渲染器

    一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url f ...

  6. Django视图基类

    Django视图基类 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 一 .视图 REST framework 提供 ...

  7. Django视图扩展类

    Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...

  8. Python中函数、类、模块和包的调用

    初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...

  9. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

随机推荐

  1. centos 开启关闭网卡

    ifdown ifcfg-enp7s0 关闭网卡 ifup ifcfg-enp7s0 开启网卡

  2. centos7 更改ip

    http://blog.csdn.net/heimerdinger_feng/article/details/71171231 CentOS7在桥接模式下配置静态ip 原创 2017年05月04日 1 ...

  3. Java 检查IPv6地址的合法性

    Java 检查IPv6地址的合法性 由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋. 一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段. 提前了解一些IPv6的知识,还是有必 ...

  4. 删除badi及badi interface

    转自:https://blog.csdn.net/zeewjj/article/details/7963147 Use Function Module OO_INTERFACE_DELETE and ...

  5. k8s install kubeadm网络原因访问不了谷哥and gpg: no valid OpenPGP data found. 解决办法

    gpg: no valid OpenPGP data found. 解决办法 待做.................................... 卡助在这curl -s https://pa ...

  6. golang web框架设计7:整合框架

    把前面写好的路由器,控制器,日志,都整合在一起 全局变量和初始化 定义一些框架的全局变量 var ( BeeApp *App AppName string AppPath string StaticD ...

  7. 小程序签名MD5加密

    最近小程序需求一个签名加密,要把请求参数按键值排序并转化为字符串,然后进行MD5加密. //时间戳 var timestamp = (Date.parse(new Date()))/1000;//签名 ...

  8. 如何制作红蓝3d电影(详细教程)

    自20世纪初以来,电影制作人一直试图通过制作3D电影来利用我们的双眼.现在,由于大量相对实惠的3D电视,你可以享受电影院以外的额外空间 - 你自己拍摄的视频.对于大预算的电影,电影摄影师使用两个相连的 ...

  9. OpenCV3编程入门.知识点

    1. 第三部分 掌握 imgproc 组件 第六章 图像处理 6.1.线性滤波: Pdf.P170 Pdf.P171 平滑处理(smoothing)(模糊处理(bluring))-- 使用频率很高 - ...

  10. 洛谷 题解 P1352 【没有上司的舞会】

    树形DP的一道较为基础的模板题 状态 dp[i][0/1]为第i个员工是否来参加的最大值 转移 先找到根节点 先遍历完它的儿子,再来更新答案 dp[i][0]+=max(dp[j][0],dp[j][ ...