数据分页显示

分页及优化

先思考一个问题,现在假设已知有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 % }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值