分页

个人分页

class Pagination(object):

    def __init__(self, request,current_page_num, all_count, per_page_num=10, pager_count=11):
        """
        个人分页器 1.1版本  查询字符串获取page参数
        :param request:           保存搜索条件
        :param current_page_num: 当前页码数
        :param all_count:        总个数
        :param per_page_num:     每页显示个数
        :param pager_count:      显示的总页码数
        """
        try:
            current_page_num = int(current_page_num)
        except Exception as e:
            current_page_num = 1
        if current_page_num < 1:
            current_page_num = 1

        self.current_page_num = current_page_num
        self.all_count = all_count
        self.per_page_num = per_page_num
        # 总 页 码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager
        self.pager_count = pager_count
        # 如果不改最大页码数 那么pager_count_half为5
        self.pager_count_half = int((pager_count-1) / 2)

        # 保存搜索条件
        import copy
        self.params = copy.deepcopy(request.GET)

    @property
    def start(self):
        return (self.current_page_num - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page_num * self.per_page_num

    # 定义一个后一页序号紧跟着前一页序号 的方法
    def counter(self):
        return (self.current_page_num - 1) * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager < self.pager_count:
            pager_start = 1
            pager_end = self.all_pager
        # 总页码 > 11个
        else:
            # 当前页如果 <= 页面上最多显示11/2个页码
            if self.current_page_num <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count

            # 如果当前页+5 大于 最大页码数
            else:
                if (self.current_page_num + self.pager_count_half) > self.all_pager:
                    pager_start = self.all_pager - self.pager_count + 1
                    pager_end = self.all_pager
                else:
                    pager_start = self.current_page_num - self.pager_count_half
                    pager_end = self.current_page_num + self.pager_count_half
        page_html_list = []
        first_page = '<li><a href="?page={}">首页</a></li>'.format(1)
        page_html_list.append(first_page)

        if self.current_page_num <= 1:
            prev_page = '<li class="disabled"><a herf="">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page={}">上一页</a></li>'.format(self.current_page_num-1)

        page_html_list.append(prev_page)

        for i in range(pager_start, pager_end+1):
            self.params["page"] = i
            if i == self.current_page_num:
                temp = "<li class='active'><a href='?{}'>{}</a></li>".format(self.params.urlencode(),i)
            else:
                temp = "<li><a href='?{}'>{}</a></li>".format(self.params.urlencode(),i)
            page_html_list.append(temp)

        # 如果当前页大于最大页码数
        if self.current_page_num >= self.all_pager:
            next_page = "<li class='disabled'><a herf='#'>下一页</a></li>"
        else:
            next_page = "<li><a href='?page={}'>下一页</a></li>" .format(self.current_page_num+1)
        page_html_list.append(next_page)

        last_page = '<li><a href="?page={}">尾页</a></li>' .format(self.all_pager)
        page_html_list.append(last_page)

        print(page_html_list)

        return "".join(page_html_list)

html代码

<nav aria-label="Page navigation">
	  <ul class="pagination pull-right">
	    {{ pagination.page_html|safe }}
	  </ul>
</nav>

如何使用

from utils.page import Pagination

def news_list(request):
    newses = News.objects.select_related('category','author').all()
    page_num = request.GET.get('page')
    count = newses.count()
    pagination = Pagination(request,page_num,count,per_page_num=2,)
    newses = newses[pagination.start:pagination.end]
    context = {
        'categories':NewsCategory.objects.all(),
        'newses':newses,
        'pagination':pagination
    }
    return render(request,'cms/news_list.html',context=context)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值