python实现分页

分页及优化

先思考一个问题,如今假设已知有100页数据,当前是第1页,要得出1-10的页码数,而当前若是是第50页,则要输出46-55的页码数html

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文件,web

能够在模板中使用{ % load pagetag % }加载django

注意:templatetags目录名不能更改,pagetag.py文件能够自定义,但对应的在模板中加载时也须要更更名字svg

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 % }