欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-25 16:17:02
Django自定义分页并保存搜索条件 1、自定义分页组件pagination.py 2、view视图 3、templates模板 4、页面展示 ......

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、页面展示

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