分页及优化
先思考一个问题,现在假设已知有100页数据,当前是第1页,要得出1-10的页码数,而当前如果是第50页,则要输出46-55的页码数
def pageshow(count,p):
'''
count 总页数,p 当前页
begin 开始页
end 结束页
'''
# 开始页
begin = p-4
# 结束页
end = p+5
# 判断如果当前页 小于5
if p < 5:
# 则开始页为1
begin = 1
# 结束页为10
end = 10
# 当前页在最后五页之内
if p > count-5:
# 则开始页为总页数-9
begin = count - 9
# 结束页为总页数
end = count
# 判断如果开始页 小于等于 0,则开始页为1
if begin <= 0:
begin = 1
s = ''
for x in range(begin,end+1):
print(x)
pageshow(100,50)
1. 自定义过滤器
在当前应用目录下创建templatetags目录和pagetag.py文件
可以在模板中使用{ % load pagetag % }加载
自定义过滤器注意事项:
- templatetags目录名不能更改
- pagetag.py文件可以自定义,但对应的在模板中加载时也需要更改名字
templatetags
├── pagetag.py
----------------pagetag.py-------------------------
from django import template
register = template.Library()
# 自定义页面优化显示标签
@register.simple_tag
def PageShow(count,request):
# 当前页码数,默认为1
p = int(request.GET.get('p',1))
begin = p - 4
end = p + 5
# 当前页在最后五页之内
if p > count-5:
begin = count - 9
end = count
# 当前页在前五页之内
if p < 5:
begin = 1
end = 10
#总页数少于十页
if count < 10:
begin = 1
end = count
# 获取当前请求的url
url = request.path
# 获取当前请求中的参数
# 去除参数中的p
args = ''
for k,v in request.GET.items():
if k != 'p':
args += '&'+k+'='+v
s = ''
# 首页
s += '<li><a href="{url}?p={v}{args}">首页</a></li>'.format(v=1,url=url,args=args)
# 判断上一页
if p == 1:
s += '<li><a href="{url}?p={v}{args}">上一页</a></li>'.format(v=1,url=url,args=args)
else:
s += '<li><a href="{url}?p={v}{args}">上一页</a></li>'.format(v=p-1,url=url,args=args)
# 循环页码数
for x in range(begin,end+1):
if x == p:
s += '<li class="am-active"><a href="{url}?p={v}{args}">{v}</a></li>'.format(v=x,url=url,args=args)
else:
s += '<li ><a href="{url}?p={v}{args}">{v}</a></li>'.format(v=x,url=url,args=args)
# 判断下一页
if p == count:
s += '<li><a href="{url}?p={v}{args}">下一页</a></li>'.format(v=count,url=url,args=args)
else:
s += '<li><a href="{url}?p={v}{args}">下一页</a></li>'.format(v=p+1,url=url,args=args)
# 尾页
s += '<li><a href="{url}?p={v}{args}">尾页</a></li>'.format(v=count,url=url,args=args)
# 总页数
s += '<li>共{v}页</li>'.format(v=count)
return format_html(s)
2. 定义路由
# 后台商品列表
url(r'^goodsindex', goodsviews.goodsindex,name="goodsindex"),
3. 定义视图函数,并查询数据,进行分页
# 获取分页的数据
ob = Goods.objects()
# 数据分页
from django.core.paginator import Paginator
# 实例化分页类
paginator = Paginator(ob,2)
# 获取当前页码
p = int(request.GET.get('p',1))
# 获取分页数据对象[{id:1},{id:2}] [{id:3},{id:4}]
goodslist= paginator.page(p)
# 分配数据
context = {'goods':goodslist}
4. 定义模板.加载数据和分页数据
{ % load adminpagetag % }
{ % PageShow goods.paginator.num_pages request % }