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 ...
随机推荐
- node 文件操作
对文件的各种操作,使用姿势如下 文件操作单例 @example fu.exist(file); //是否存在 fu.copy(file, 'new-path'); //复制到某个新目录 fu.move ...
- 1-Android开发验证码(使用第三方Mob,注册)
http://www.mob.com/ 注册以后 可以直接放在 可以下载到手机里面试一下了 后续就不截图了 补充: 自定义签名
- 如何应用ML的建议-下
正则化与过拟合(highvariance)和欠拟合(highbias)的关系-部分(五) ML的诊断方法-部分(六) 如何采取下一步-部分(七) 部分(五) 从图中可以看出,正则化项可以用来影响模型函 ...
- 【LeetCode191】Number of 1 Bits★
1.题目 2.思路 方法一:常规方法. 方法二:给面试官惊喜的解法. 3.java代码 方法一代码: public class Solution { // you need to treat n as ...
- CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...
- [HAOI2017]方案数[组合计数、容斥、dp]
题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...
- item 8: 比起0和NULL更偏爱nullptr
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 先让我们看一些概念:字面上的0是一个int,不是一个指针.如果C+ ...
- VC++6.0的使用感想
VC++6.0是我接触的第一款编程软件,一直以来都是使用这款软件来完成程序的编写,调试,运行.一直以来都是用C语言编写代码.而VC++6.0窗口简洁明了,占用资源少,上手容易,个人表示很喜欢. VC+ ...
- 12.15 Daily Scrum
Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表. 邓亚梅 美化搜索框UI. 美 ...
- K 班前7次作业成绩汇总
K 班前7次作业成绩汇总 得分榜 千帆竞发 详细 短学号 名 1 2 3 4 5 6 7 TOTAL 505 基智 4.55 1 -2 0 0 -10 4.37 -2.08 414 圳源 5.43 2 ...