Django自定义分页并保存搜索条件

Django自定义分页并保存搜索条件

1、自定义分页组件pagination.py

import copy


class Pagination:
    def __init__(self, current_page_num, all_count, request, per_page_num=10, page_count=11):
        """
        封装分页相关数据
        :param current_page_num: 当前页码数
        :param all_count: 数据库中总数据条数
        :param per_page_num: 每页显示的数据量
        :param page_count: 最大显示页数
        """

        try:
            current_page = int(current_page_num)
        except Exception as e:
            current_page = 1

        # 页码数小于1时显示第一页
        if current_page < 1:
            current_page = 1

        # 取总页码数
        self.all_page_count, temp = divmod(all_count, per_page_num)
        if temp:
            self.all_page_count += 1

        # 页码数大于最大页码数时显示最后一页
        if current_page > self.all_page_count:
            current_page = self.all_page_count

        self.current_page = current_page
        self.per_page_num = per_page_num
        self.half_page_count = int((page_count - 1) / 2)

        # 总页码数小于最大页码数
        if self.all_page_count < page_count:
            self.start_page = 1
            self.end_page = self.all_page_count + 1
        else:
            if self.current_page < self.half_page_count:
                # 当页码条数据靠近最左边时
                self.start_page = 1
                self.end_page = page_count + 1
            elif self.all_page_count - self.current_page < self.half_page_count:
                # 当页码条数据靠近最右边时
                self.start_page = self.all_page_count - page_count + 1
                self.end_page = self.all_page_count + 1
            else:
                # 页码条正常显示在中间位置
                self.start_page = self.current_page - self.half_page_count
                self.end_page = self.current_page + self.half_page_count + 1

        # 获取get参数: <QueryDict:{key: value}>
        params = request.GET
        # 不进行deepcopy将无法改变其里面的值
        self.new_params = copy.deepcopy(params)

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

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

    def show_html(self):
        html_list = []
        if self.current_page == 1:
            first_page = '<li class="disabled"><a>{0}</a></li>'.format('首页')

        else:
            # 将page传入new-params中
            self.new_params['page'] = 1
            # 对new_params进行urlencode格式化: 'key=value&key2=value2&page=1'
            first_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '首页')
        # 将"首页"html代码加入html_list中
        html_list.append(first_page)

        if self.current_page == 1:
            prev_page = '<li class="disabled"><a>{0}</a></li>'.format('&laquo;')
        else:
            self.new_params['page'] = self.current_page - 1
            prev_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '&laquo;')

        # 将"上一页"html代码加入html_list中
        html_list.append(prev_page)

        for i in range(self.start_page, self.end_page):
            if self.current_page == i:
                page_bar = '<li class="active"><a>{0}</a></li>'.format(i)
            else:
                self.new_params['page'] = i
                page_bar = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), i)

            # 将"每一页"html代码加入html_list中
            html_list.append(page_bar)

        if self.current_page == self.all_page_count:
            next_page = '<li class="disabled"><a>{0}</a></li>'.format('&raquo;')
        else:
            self.new_params['page'] = self.current_page + 1
            next_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '&raquo;')

        # 将"下一页"html代码加入html_list中
        html_list.append(next_page)

        if self.current_page == self.all_page_count:
            last_page = '<li class="disabled"><a>{0}</a></li>'.format('尾页')
        else:
            self.new_params['page'] = self.all_page_count
            last_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '尾页')

        # 将"尾页"html代码加入到html_list中
        html_list.append(last_page)

        return ''.join(html_list)

2、view视图

class CustomerView(View):
    def get(self, request):
        customer_list = Customer.objects.all()
        page = request.GET.get('page')
        # 实例化pagination对象
        pagination = Pagination(page, customer_list.count(), request, per_page_num=1)
        # 对数据列表进行分页
        customer_list = customer_list[pagination.start:pagination.end]
        context = {
            'customer_list': customer_list,
            'page_html': pagination.show_html()
        }
        return render(request, 'customer_list.html', context)

    def post(self, request):
        pass

3、templates模板

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

4、页面展示

原文地址:https://www.cnblogs.com/wangyueping/p/11380793.html