• Django之分页升级版


    如果查询出的数据,被分页了,这个时候翻页的时候应该讲页数的参数和查询的参数一块在URL上显示

    """
    分页器
    """
    
    from django.utils.safestring import mark_safe
    from django.http import QueryDict
    
    
    class Pagination:
    
        # request 为request请求, all_count为所有数据的个数, query_params为查询的时候将查询结果与页数进行拼接, per_num为一页展示多少数据, max_show分多少页
        def __init__(self, request, all_count, query_params=QueryDict(), per_num=10, max_show=11):
            # 基本的URL
            self.base_url = request.path_info
            # 查询条件
            self.query_params = query_params
            self.query_params._mutable = True
            # 当前页码
            try:
                self.current_page = int(request.GET.get('page', 1))
                if self.current_page <= 0:
                    self.current_page = 1
            except Exception as e:
                self.current_page = 1
                print(e)
            # 最多显示的页码数
            self.max_show = max_show
            half_show = max_show // 2
    
            # 每页显示的数据条数
            self.per_num = per_num
            # 总数据量
            self.all_count = all_count
    
            # 总页码数
            self.total_num, more = divmod(all_count, per_num)
            if more:
                self.total_num += 1
    
            # 总页码数小于最大显示数:显示总页码数
            if self.total_num <= max_show:
                self.page_start = 1
                self.page_end = self.total_num
            else:
                # 总页码数大于最大显示数:最多显示11个
                if self.current_page <= half_show:
                    self.page_start = 1
                    self.page_end = max_show
                elif self.current_page + half_show >= self.total_num:
                    self.page_end = self.total_num
                    self.page_start = self.total_num - max_show + 1
                else:
                    self.page_start = self.current_page - half_show
                    self.page_end = self.current_page + half_show
    
        @property
        def start(self):
            return (self.current_page - 1) * self.per_num
    
        @property
        def end(self):
            return self.current_page * self.per_num
    
        @property
        def show_li(self):
            # 存放li标签的列表
            html_list = []
    
            self.query_params['page'] = 1
            # query=a&page=1
    
            first_li = '<li><a href="{}?{}">首页</a></li>'.format(self.base_url, self.query_params.urlencode())
            html_list.append(first_li)
    
            if self.current_page == 1:
                prev_li = '<li class="disabled"><a><<</a></li>'
            else:
                self.query_params['page'] = self.current_page - 1
                prev_li = '<li><a href="{0}?{1}"><<</a></li>'.format(self.base_url, self.query_params.urlencode())
            html_list.append(prev_li)
    
            for num in range(self.page_start, self.page_end + 1):
                self.query_params['page'] = num
                if self.current_page == num:
                    li_html = '<li class="active"><a href="{0}?{1}">{2}</a></li>'.format(self.base_url,
                                                                                         self.query_params.urlencode(), num)
                else:
                    li_html = '<li><a href="{0}?{1}">{2}</a></li>'.format(self.base_url,
                                                                           self.query_params.urlencode(), num)
                html_list.append(li_html)
    
            if self.current_page == self.total_num:
                next_li = '<li class="disabled"><a>>></a></li>'
            else:
                self.query_params['page'] = self.current_page + 1
                next_li = '<li><a href="{0}?{1}">>></a></li>'.format(self.base_url, self.query_params.urlencode())
    
            html_list.append(next_li)
    
            self.query_params['page'] = self.total_num
            last_li = '<li><a href="{}?{}">尾页</a></li>'.format(self.base_url, self.query_params.urlencode())
            html_list.append(last_li)
    
            return mark_safe(''.join(html_list))
    # 解决搜索后的url翻页拼接问题
            print('query', request.GET)  # <QueryDict: {'query': [结果]}>
            # query=结果
            print(request.GET.urlencode())
            # _mutable=True  这样就可以修改了
            # query_params = copy.deepcopy(request.GET)
            query_params = request.GET.copy()  # 为了将查询结果与页数都放到url上
            # query_params._mutable = True
    
            page = pagination.Pagination(request, customer.count(), query_params, per_num=3)
            return render(request, 'crm/customer_list.html', {
                "customer": customer[page.start:page.end],
                'html_str': page.show_li,
            })
  • 相关阅读:
    线性最小二乘两种方法
    Coursera machine learning 第二周 编程作业 Linear Regression
    Coursera machine learning 第二周 quiz 答案 Octave/Matlab Tutorial
    Coursera machine learning 第二周 quiz 答案 Linear Regression with Multiple Variables
    Codeforces Round #392 (Div. 2) F. Geometrical Progression
    四边形不等式优化DP——石子合并问题 学习笔记
    Codeforces Round #373 (Div. 2) E. Sasha and Array
    hihoCoder #1388 : Periodic Signal
    hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)
    Java动态代理分析
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9846023.html
Copyright © 2020-2023  润新知