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 ...
随机推荐
- MySql数据库的下载和安装卸载
下载:到mysql官网下载 卸载 1.找到mysql安装目录下的my.ini文件 2.找到配置项datadir datadir="D:/develop /MySQL/MySQL Server ...
- c++ template Queue
#pragma once#include <iostream>#include <iomanip> using namespace std; template<class ...
- mvc 接收json 集合 实例
开始测试了一下,后台用实体类接收,所报异常如下 无奈之下只能传为字符串,然后字符串转json 页面代码如下 后台controller如下:
- pip安装软件报错 utf-8 code can't decode byte 0xcf in position7
pip安装软件报错 utf-8 code can't decode byte 0xcf in position7 根据错误提示的路径找到__init__.py文件 根据错误提示的最后几句话找到对应的行 ...
- centos7 vim环境优化
centos7默认是使用vi,而不是使用vim,所以,我们需要修改一下vi的别名,并且,我们使用neovim,vi毕竟还是有很多功能比较原始 所以 yum install neovim -ycat & ...
- Java基础——值传递
值传递? 参数传递的值的拷贝,改变拷贝不影响原参数. 引用传递? 参数传递的是参数本身,改变形参,实参也改变. Java中是什么传递? Java中只有值传递 实际情况为什么不对呢? 1. 基本数据类型 ...
- Spring分层次建包
1.包分三层 配置包 控制器包 模型包 视图层 模板放 src/main/resources下的templates目录下
- HDU 1317:XYZZY
Problem Description It has recently been discovered how to run open-source software on the Y-Crate g ...
- golang的定时器NewTimer、NewTicker使用
package main import ( "fmt" "sync" "time" ) /** *ticker只要定义完成,从此刻开始计时, ...
- 【Cisco】实现同一个路由器一个端口用动态路由,另一个端口用静态路由
一.先构建以下网络图: 准备三台路由器,三台交换机,三台主机,连接所有设备并配置端口IP和网关,DCE端口的时钟频率都设置为64000.