首页 > 其他 > 详细

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

时间:2019-08-20 10:53:06      阅读:81      评论:0      收藏:0      [点我收藏+]

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自定义分页并保存搜索条件

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!