分页例子程序:

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 分页的更多相关文章

  1. Django-website 程序案例系列-17 forms表单验证的字段解释

    1.Django内置字段如下: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial ...

  2. Django-website 程序案例系列-16 modle.form(表单验证)

    案例程序: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. Django-website 程序案例系列-18 多表跨表操作优化

    详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 在数据库有外键的时候,使用 select_related() 和 pref ...

  4. Django-website 程序案例系列-15 singnal分析

    在django框架中singnal的应用相当于在你执行某些重要函数语句时在这条语句的前后放置两个预留的钩子,这两个钩子就是singnal,这个钩子也可以理解成两个触发器,当出现执行语句前后是触发执行某 ...

  5. Django-website 程序案例系列-14 缓存的应用配置文件的写法

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  6. Django-website 程序案例系列-3 URL详解

    django参考资料:http://docs.30c.org/djangobook2/index.html urls.py是django中控制接收前端的参数指定函数去执行逻辑 第一种 函数的方式 ur ...

  7. Django-website 程序案例系列-13 中间件

    自定义中间件1: from django.utils.deprecation import MiddlewareMixin # 中间件需要引用的包 class Row1(MiddlewareMixin ...

  8. Django-website 程序案例系列-12 CSRF

    django为用户实现防止跨站请求伪造的功能 需要配置settings.py:  django.middleware.csrf.CsrfViewMiddleware 1. form表单提交 <f ...

  9. Django-website 程序案例系列-11 验证装饰器

    FBV装饰器: def auth(func): #装饰器函数 def inner(request, *args, **kwargs): v = request.COOKIES.get('usernam ...

随机推荐

  1. 动手动脑(lesson 6)

    一.继承条件下的构造方法调用 运行结果: 二. 答:构造函数的主要作用是初始化环境,子类是继承的父类,也就是说父类中有的子类全都有,而子类中有的父类不一定有,因此子类运行会调用父类构造函数,而父类不可 ...

  2. day88

    ContentType 场景需求:比方说我们现有两种商品,但是他们对应着一个价格策略表,为了防止数据库的浪费,我们在价格策略中加入一个表名字段,一个表明对应的id字段,这样的设计既优化了数据库,还不怕 ...

  3. 各种工业以太网比较(EtherCAT,EtherNet/IP,ProfiNet,Modbus-TCP,Powerlink)

    EtherCAT(以太网控制自动化技术)是一个以以太网为基础的开放架构的现场总线系统,EterCAT名称中的CAT为ControlAutomation Technology(控制自动化技术)首字母的缩 ...

  4. LiveCharts文档-4基本绘图-1基本线条图

    原文:LiveCharts文档-4基本绘图-1基本线条图 4基本绘图-1基本线条图 using System; using System.Windows.Forms; using System.Win ...

  5. 【APIO2016】烟火表演

    题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...

  6. Linux查看日志常用命令

    1.动态循环查看文件内容 tail  -n  10  test.log   查询日志尾部最后10行的日志; tail -n +10 test.log    查询10行之后的所有日志; head -n ...

  7. 本地开发环境搭建(windows)

    一.虚拟器安装 1.概念 ・为什么要搭建搭建模拟环境 在租借服务器前用手中的PC模拟一个服务器的环境,可以打包与团队人员分享 ・什么是Vagrant https://segmentfault.com/ ...

  8. php7与之前的区别和更新【转】

    http://blog.csdn.net/u011957758/article/details/73320083 本文是一篇讲座听后+后续研究的总结. 话说当年追时髦,php7一出就给电脑立马装上了, ...

  9. 作业20171130 final发布 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月16日 17:00. 更新 第一周和第二周成绩分别应占比20%和10%,计算时刚好反了.所以同学们的最终成绩有变 ...

  10. Stanford Word Segmenter的特定领域训练

    有没有人自己训练过Stanford Word Segmenter分词器,因为我想做特定领域的分词,但在使用Stanford Word Segmenter分词的时候发现对于我想做的领域的一些词分词效果并 ...