django 自己实现分页(拿来即用)

from django.conf import settings
from django.utils.safestring import mark_safe


class MyPage:
    def __init__(self, obj, page, page_url, query_get):
        """
        :param obj: 需要做分页的数据源
        :param page: 分页页码
        :param page_url: 地址 request.path,
        :param page_url: 可修改的Queryset  request.GET.copy()  获取地址上参数做查询后的分页使用
        """
        self.obj = obj
        self.page = page
        self.page_url = page_url
        self.query_get = query_get

        page_num = settings.PAGE_NUM  # 分页每页显示的数量
        page_max_num = settings.PAGE_MAX_NUM  # 每页最多显示多少分页
        obj_count = self.obj.count()  # 总数据量
        a, b = divmod(obj_count, page_num)
        self.obj_page_num = a + 1 if b else a  # 数据最多能分多少页
        half_page = page_max_num // 2  # 计算中间页码做移动使用

        if self.page:
            self.page = int(self.page)
        else:
            self.page = 1

        if self.obj_page_num < 1:
            self.obj_page_num = 1

        left_page = 1
        right_page = self.obj_page_num

        if self.obj_page_num <= page_max_num:  # 如果数据能分的页数没设定显示的页数相同或更小时
            left_page = left_page
            right_page = right_page
        else:
            if self.page == 1 or self.page < page_max_num:
                left_page = 1
                right_page = page_max_num
            else:
                left_page = self.page - half_page  # 移动
                right_page = self.page + half_page

            if self.page > self.obj_page_num - page_max_num:  # 判断最后几页固定页码
                left_page = self.obj_page_num - page_max_num
                right_page = self.obj_page_num

        self.page_range = range(left_page, right_page + 1)
        self.obj_page_list = self.obj[page_num * (self.page - 1): self.page * page_num]

    @property
    def obj_list(self):
        """
        :return: 分好页后每页的数据
        """
        return self.obj_page_list

    def page_html(self):
        """
        :return: 分页html代码块
        """
        _page_html = ''
        self.query_get['page'] = 1
        page_head = '<nav aria-label="Page navigation"><ul class="pagination">' \
                    '<li><a href="{0}?{1}">首页</a></li>'.format(self.page_url, self.query_get.urlencode())
        _page_html += page_head
        if self.page == 1:
            page_last = '<li class="disable"><a href="javascript:void(0)" name="page" aria-label="Previous">' \
                        '<span aria-hidden="true">&laquo;</span></a></li>'
        else:
            page_last = '<li class="disable"><a href="{0}?{1}" name="page" aria-label="Previous">' \
                        '<span aria-hidden="true">&laquo;</span></a></li>'.\
                format(self.page_url, self.query_get.urlencode())
        _page_html += page_last
        for i in self.page_range:
            self.query_get['page'] = i
            if i == self.page:
                page_content = '<li class="active"><a href="{0}?{1}" name="page">{2}</a></li>'.\
                    format(self.page_url, self.query_get.urlencode(), i)
                _page_html += page_content
            else:
                page_content = '<li class=""><a href="{0}?{1}" name="page">{2}</a></li>'.\
                    format(self.page_url, self.query_get.urlencode(), i)
                _page_html += page_content
        if self.page >= self.obj_page_num:
            page_next = '<li class="disable"><a href="javascript:void(0)" aria-label="Next"><span aria-hidden="true">' \
                        '&raquo;</span></a>'
        else:
            self.query_get['page'] = self.page + 1
            page_next = '<li class="disable"><a href="{0}?{1}" aria-label="Next">' \
                        '<span aria-hidden="true">&raquo;</span></a>'.format(self.page_url, self.query_get.urlencode())
        _page_html += page_next
        self.query_get['page'] = self.obj_page_num
        page_final = '<li><a href="{0}?{1}">尾页</a></li></li></ul></nav>'.format(self.page_url, self.query_get.urlencode())
        _page_html += page_final
        return mark_safe(_page_html)
def customer_show(request):
    if request.method == 'GET':
        customer_obj = models.Customer.objects.all().order_by('-id')

        # 分页
        page = request.GET.get('page')  # 获取当前页
        my_paging = MyPage(customer_obj, page, request.path)
        customer_obj = my_paging.obj_list
        html_page = my_paging.page_html()
        return render(request, 'customer.html',
                      {'customers_obj': customer_obj, 'html_page': html_page})

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值