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 ...
随机推荐
- ingress-nginx 添加https证书
1.配了一个证书,发现报错: kubectl logs ingress-nginx-controller-96fnv -n ingress-nginx unexpected error vali ...
- 【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★
1.题目 2.思路 3.java代码 //测试 public class BuildTreeUsingInorderAndPreorder { public static void main(Stri ...
- LOJ2803 CCC2018 平衡树 数论分块、记忆化搜索
传送门 题意差评,其实就是一个递推式:\(f_1 = 1 , f_i = \sum\limits_{j=2}^i f_{\lfloor \frac{i}{j} \rfloor}\),然后求\(f_N\ ...
- Maven私有仓库: 发布release版本报错:Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.
今天在将一个maven组件由SNAPSHORT升级为正式版本1.0.0,然后执行发布: mvn clean deploy -pl ielong-common -am -DskipTests, 报错:R ...
- subprocess.Popen指令包含中文导致乱码问题解决
其实解决起来非常简单,如果了解到Windows中文系统编码为GB2312的话 只需将你包含中文的指令字符串编码为GB2312即可 cmd = u'cd 我的文档' cmd.encode('gb2312 ...
- 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天
51reboot 运维开发又双叒叕的搞活动了—— Python 运维开发 18 天训练营课程, 剁手价1299 最后2天 上课方式:网络直播/面授(仅限北京) DAY1 - DAY4 Python3 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--控制器和处理函数的注册篇(4/8)【controller+action】
文章目录 前情概要 前边的文章把一些基本的前置任务都完成了.接下就是比较重要的处理函数action是如何自动发现和注册的拉,也就是入口函数RouteHandler(也是我们的第一个express中间件 ...
- 【个人总结】软件工程M1/M2总结
个人博客连接: http://www.cnblogs.com/lwq12061168/p/4094252.html http://www.cnblogs.com/lwq12061168/p/40284 ...
- 【CV】ICCV2015_Unsupervised Learning of Visual Representations using Videos
Unsupervised Learning of Visual Representations using Videos Note here: it's a learning note on Prof ...
- BugPhobia团队篇章:团队管理与Github源代码管理说明
0x00:序言 To the searching tags, you may well fall in love withhttp://xueba.nlsde.buaa.edu.cn/ 再见,无忧时光 ...