方法一: 模拟分页
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. Qt编写自定义控件30-颜色多态按钮

    一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...

  2. iOS知识点总结

    1.监测网络状态: - (void)checkNetwork { __block NSString *tips; _reachiabilityManager = [AFNetworkReachabil ...

  3. centos 7设置limit,不生效问题

    1:记录未修改之前的ulimit值 [root@bogon ~]# ulimit -a 2:修改配置文件 vim  /etc/security/limits.conf   在后面添加 *      s ...

  4. 容器版Jenkins连接Kubernetes---------非容器版jenkins是无法安装kubenetes插件的,所以无法连接k8s

    容器版Jenkins连接Kubernetes 特别注意:必须用谷歌浏览器,而且非容器版jenkins是无法安装kubernetes插件的,所以无法连接k8s 一.环境说明 OS系统版本:Ubuntu ...

  5. webdriervAPI(警告框处理)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  6. PHP常用正则表达式精选

    $regex = '[\u4e00-\u9fa5]'; //匹配中文字符的正则表达式 $regex = '^[\u4E00-\u9FA5A-Za-z0-9]+$'; or $regex = '^[\u ...

  7. 设计模式七大原则(C++描述)

    前言 最近在学习一些基本的设计模式,发现很多博客都是写了六个原则,但我认为有7个原则,并且我认为在编码中思想还是挺重要,所以写下一篇博客来总结下 之后有机会会写下一些设计模式的博客(咕咕咕...... ...

  8. 义隆单片机学习笔记之(一) 硬件框架&资源下载

    参考网址: 点击链接或右键链接地址 (台湾义隆官网)http://www.emc.com.tw/chs/tech_8bit.asp (EM78P153K官方资料)http://www.emc.com. ...

  9. 【ARM-Linux开发】【Qt开发】Qt Creator自定义编译运行步骤

    原文:http://www.linuxidc.com/Linux/2015-04/115763.htm 一直用Qt Creator开发.无它,只是因为linux下C++ IDE选择不多.同时因为我抛弃 ...

  10. 【编程开发】MD5和RSA

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. (1)MD5 MD5(单向散列算法)的全称是Message-Di ...