Django-website 程序案例系列-9 分页
分页例子程序:
LIST = [] #全局列表
for i in range(103): #1:100的列表
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p', 1) # GET接收的都是字符串
current_page = int(current_page) #字符串转换成数字 per_page_count = 5 #每页显示多少条数据
start = (current_page - 1) * per_page_count #页数显示数据开始
end = current_page * per_page_count #页数显示数据接收
data = LIST[start:end] #生成显示列表的索引 all_count = len(LIST) #判断列表总长度
total_count, y = divmod(all_count, per_page_count ) #取模函数,取10的模,count为取模多少次,y是剩余多少
if y: #如果y不为0 说明还有剩余的数
total_count += 1 page_list = [] #建立一个空列表
pageer_num = 7 #显示页码数
start_index = current_page - 5 #开始显示的页码数
end_index = current_page + 5 + 1 #结束显示的页码数
if total_count < pageer_num: #
start_index = 1
end_index = total_count + 1
else:
if current_page <= (pageer_num + 1)/2:
start_index = 1
end_index = pageer_num + 1
else:
start_index = current_page - (pageer_num - 1)/2
end_index = current_page + (pageer_num + 1)/2
if (current_page + (pageer_num - 1)/2) > total_count:
end_index = total_count + 1
start_index = total_count - pageer_num + 1 if current_page == 1: #当页数为开始时
prev = '<a class="page" href="javascript:void(0);">上一页</a>' #添加上一页标签不做跳转
else:
prev = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (current_page - 1) #否则添加带跳转参数的标签
page_list.append(prev)
for i in range(int(start_index), int(end_index)): #显示的页数是取模的数
if i == current_page: #如果判断页数为当前显示的页数
temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i) #给列表中传这个字符串,class中加入active的css样式
else:
temp = '<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i) #不是当前显示就传这个字符串
page_list.append(temp) #将字符串压入列表 if current_page == total_count: #当页数显示到尽头时
nex = '<a class="page" href="javascript:void(0);">下一页</a>' #添加下一页标签不做跳转
else:
nex = '<a class="page" href="/user_list/?p=%s">下一页</a>' % (current_page + 1) #否则添加带跳转参数的标签
page_list.append(nex)
#以下为添加跳转框的js代码
jump = """
<input type='text' /><a onclick='jumpTo(this, "/user_list/?p=")'>Go</a>
<script>
function jumpTo(th, base){
var val = th.previousSibling.value;
location.href = base + val;
}
</script>
"""
page_list.append(jump)
page_str = mark_safe("".join(page_list)) #转换成字符串,并打上安全标记传都前端
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pagination .page{
display: inline-block;
padding: 5px;
background-color: cornflowerblue;
margin: 10px;
}
.pagination .page.active{
background-color: #00aa00;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
<div class="pagination">
{{ page_str }}
</div>
</body>
</html>
封装成分页类:
class Page:
def __init__(self, current_page, data_count, per_page_num=10, pager_num=7):
self.current_page = current_page
self.data_count = data_count
self.per_page_num = per_page_num
self.pager_num = pager_num
@property #调用该方法时不用加括号 如:x.start() 直接使用 x.start 就可以调用
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
@property
def total_count(self):
v, y = divmod(self.data_count, self.per_page_num)
if y:
v += 1
return v
def page_str(self, base_url):
page_list = []
if self.total_count < self.pager_num:
start_index = 1
end_index = self.total_count + 1
else:
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1
end_index = self.pager_num + 1
else:
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
end_index = self.total_count + 1
start_index = self.total_count - self.pager_num + 1
if self.current_page == 1:
prev = '<a class="page" href="javascript:void(0);">上一页</a>'
else:
prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url, self.current_page - 1)
page_list.append(prev)
for i in range(int(start_index), int(end_index)):
if i == self.current_page:
temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
else:
temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
page_list.append(temp)
if self.current_page == self.total_count:
nex = '<a class="page" href="javascript:void(0);">下一页</a>'
else:
nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url, self.current_page + 1)
page_list.append(nex)
jump = """
<input type='text' /><a onclick='jumpTo(this, "%s?p=")'>Go</a>
<script>
function jumpTo(th, base){
var val = th.previousSibling.value;
location.href = base + val;
}
</script>
""" % (base_url)
page_list.append(jump)
page_str = mark_safe("".join(page_list))
return page_str
调用分页类:
LIST = [] #全局列表
for i in range(103): #1:100的列表
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p', 1)
current_page = int(current_page) page_obj = Page(current_page, len(LIST)) data = LIST[page_obj.start: page_obj.end] page_str = page_obj.page_str("/user_list/")
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
可以直接放到一个文件夹中,作为工具来调用:

调用方法为:
from utils import pagination
obj = pagination.Page(xx,yy) #创建分页类
Django-website 程序案例系列-9 分页的更多相关文章
- Django-website 程序案例系列-17 forms表单验证的字段解释
1.Django内置字段如下: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial ...
- Django-website 程序案例系列-16 modle.form(表单验证)
案例程序: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Django-website 程序案例系列-18 多表跨表操作优化
详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 在数据库有外键的时候,使用 select_related() 和 pref ...
- Django-website 程序案例系列-15 singnal分析
在django框架中singnal的应用相当于在你执行某些重要函数语句时在这条语句的前后放置两个预留的钩子,这两个钩子就是singnal,这个钩子也可以理解成两个触发器,当出现执行语句前后是触发执行某 ...
- Django-website 程序案例系列-14 缓存的应用配置文件的写法
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- Django-website 程序案例系列-3 URL详解
django参考资料:http://docs.30c.org/djangobook2/index.html urls.py是django中控制接收前端的参数指定函数去执行逻辑 第一种 函数的方式 ur ...
- Django-website 程序案例系列-13 中间件
自定义中间件1: from django.utils.deprecation import MiddlewareMixin # 中间件需要引用的包 class Row1(MiddlewareMixin ...
- Django-website 程序案例系列-12 CSRF
django为用户实现防止跨站请求伪造的功能 需要配置settings.py: django.middleware.csrf.CsrfViewMiddleware 1. form表单提交 <f ...
- Django-website 程序案例系列-11 验证装饰器
FBV装饰器: def auth(func): #装饰器函数 def inner(request, *args, **kwargs): v = request.COOKIES.get('usernam ...
随机推荐
- Objective-C 浅拷贝与深拷贝
一个Objective-C对象通常分配在堆上,并有一个或者多个指针指向它.如下代码及其关系图所示: NSObject *obj1 = [[NSObject alloc] init]; NSObject ...
- SkylineGlobe 邻近度(Proximity)分析JavaScript源代码
邻近度(Proximity)描述了地理空间中两个地物距离相近的程度,是空间分析的一个重要手段. <html xmlns="http://www.w3.org/1999/xhtml&qu ...
- AtCoder ExaWizards 2019 简要题解
AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...
- Caffe源码中caffe.proto文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...
- 【noi.ac】#309. Mas的童年
#309. Mas的童年 链接 分析: 求$max \{sj + (s_i \oplus s_j)\}$ 因为$a + b = a \oplus b + (a \& b) \times 2$ ...
- C#获取当前堆栈的各调用方法列表
在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...
- 【转】Git版本控制软件从入门到精通学习手册
GIT 学习手册简介 本站为 Git 学习参考手册.目的是为学习与记忆 Git 使用中最重要.最普遍的命令提供快速翻阅. 这些命令以你可能需要的操作类型划分,并且将提供日常使用中需要的一些常用的命令以 ...
- 对于League of Legends的分析
League of Legends是一款在国内甚至国际上都很受欢迎的一款网络竞技行的游戏.它是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战 ...
- 6-Python3从入门到实战—基础之数据类型(元组-Tuple)
Python从入门到实战系列--目录 元组的定义 定义元组只需要在括号中添加元素,并使用逗号隔开即可 tup = ('Python','Java','C++','Kotlin') 元组与列表的区别 P ...
- spring 注入DI
web 项目的搭建 以注入对象的方式