django 自定义分页功能

django自带的分页功能有局限性,只能显示所有页码,不能显示当前页的前五和后五页的页码。所有需要自己写。

from django.shortcuts import render
from app01.models import User


class MyPaginator:
    def __init__(self, cur_page, per_page, total, show_page=11):
        try:
            self.cur_page = cur_page
        except Exception as e:
            self.cur_page = 1
        self.per_page = per_page
        self.total = total
        self.show_page = show_page
        a, b = divmod(int(self.total), self.per_page)#取余
        if b:#如果有余数
            self.total_page = a + 1#在商的结果上加1
        else:
            self.total_page = a

    def start(self):
        return (self.cur_page - 1) * self.per_page#显示开始的页码

    def end(self):
        return self.cur_page * self.per_page#显示结束的页码

    def pager(self):
        half = int((self.show_page - 1)/2)#当前页前后显示的页码数
        if self.total_page <= self.show_page:#如果总页数小于等于需要要显示的页码数
            begin = 1#页码开头为1
            end = self.total_page
        else:
            if self.cur_page <= half:#如果当前页小于等于当前页前后显示的页码数
                begin = 1
                end = self.cur_page + half
            elif self.cur_page + half > self.total_page:
                begin = self.cur_page - half
                end = self.total_page
            else:
                begin = self.cur_page - half
                end = self.cur_page + half
        paginator = []
        if self.cur_page == 1:#如果当前页为1
            label = "<a href=?cur_page=%s#></a>" % (self.cur_page)#标签为原来标签不减一
        else:
            label = "<a href=?cur_page=%s>上一页</a>" % (self.cur_page - 1)#则有上一页的标签
        paginator.append(label)
        for i in range(begin,end+1):
            label = "<a href=?cur_page=%s>%s</a>" % (i,i,)
            paginator.append(label)
        if self.cur_page >= self.total_page:
            label = "<a href=?cur_page=%s#></a>" % (self.cur_page)
        else:
            label = "<a href=?cur_page=%s>下一页</a>" % (self.cur_page + 1)
        paginator.append(label)
        return "".join(paginator)


def users(req):
    total = User.objects.all().filter(id__lt=30).count()
    cur_page = int(req.GET.get("cur_page"))
    paginator = MyPaginator(cur_page, 10, total)
    res = User.objects.all().filter(id__lt=30)[paginator.start():paginator.end()]
    return render(req,"login.html",{"res":res,"paginator":paginator})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>人员名单</h2>
<ul>
    {% for item in res %}
        <li>{{ item.username }}</li>
    {% endfor %}
</ul>
{{ paginator.pager |safe}}
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值