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 ...
随机推荐
- LevelDB深入浅出之整体架构
LevelDB是一个可持久化的KV数据库引擎,由Google传奇工程师Jeff Dean和Sanjay Ghemawat开发并开源.无论从设计还是代码上都可以用精致优雅来形容,非常值得细细品味.本文将 ...
- ThinkPHP使用smarty模板引擎的方法
ThinkPHP支持多种php模板引擎,可以根据个人需要加以配置.下面我们以Smarty模板引擎为例,给大家说说具体的操作流程! 首先去Smarty官网上下载一个Smarty.本站下载地址:http: ...
- C++ nth_element greater
#include <iostream>#include <algorithm>#include <deque>#include <vector>#inc ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_18-CMS前端页面查询开发-页面原型-创建页面和定义路由
module下创建cms目录,里面存cms模块相关的页面 在cms下创建api和components目录,components下放的就是组件. 这个组件刚才介绍的base的下的组件不一样.base下的 ...
- 微信小程序 左右联动菜单
根据左侧列表,联动跳右侧内容. 效果如图: wxml代码: <view class="page"> <!-- 左侧导航 --> <view class ...
- 《精通并发与Netty》学习笔记(07 - 基于Thrift实现Java与Python的RPC调用)
上节我们介绍了基于Thrift实现java与java的RPC调用,本节我们基于Thrift实现Java与Python的RPC调用 首先,修改data.thirft文件,将命名空间由java改为py n ...
- Fabric 查看 blockfile_000000 区块文件
进入peer docker exec -it peer bash cd /var/hyperledger/production/ledgersData/chains/chains
- 最新 东软java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.东软等10家互联网公司的校招Offer,因为某些自身原因最终选择了东软.6.7月主要是做系统复习.项目复盘.LeetCode ...
- redis安装-备份-恢复
1.安装参考:https://www.jb51.net/article/146744.htm 2.安装ruby2.3.3 .gpg2 --keyserver hkp://keys.gnupg.net ...
- docker镜像内没有vim
问题: 我们在容器中找不到vim等命令 原因: 镜像制作的时候没把这些东西加进去 解决: 用apt update更新源之后再安装vim apt update apt-get install - ...