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 = '
  • 首页
  • '.format(self.base_url, self.query_params.urlencode()) html_list.append(first_li) if self.current_page == 1: prev_li = '
  • <<
  • ' else: self.query_params['page'] = self.current_page - 1 prev_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 = '
  • {2}
  • '.format(self.base_url, self.query_params.urlencode(), num) else: li_html = '
  • {2}
  • '.format(self.base_url, self.query_params.urlencode(), num) html_list.append(li_html) if self.current_page == self.total_num: next_li = '
  • >>
  • ' else: self.query_params['page'] = self.current_page + 1 next_li = '
  • >>
  • '.format(self.base_url, self.query_params.urlencode()) html_list.append(next_li) self.query_params['page'] = self.total_num last_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)  # 
            # 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,
            })