Django分页封装

page_data.py

python 复制代码
from django.utils.safestring import mark_safe
from copy import deepcopy
class PageData:
    def __init__(self,request,queryset,page_size=1,page_num=3,page_param='page'):
        '''
        request:请求
        queryset:数据表的查询结果
        pagesize:一页显示多少条数据
        page_num:当前页面显示多少个页码
        page_param:翻页参数
        '''
        get_query_dict=deepcopy(request.GET)
        self.query_dict=get_query_dict
        self.page_param=page_param

        page=request.GET.get(page_param,"1")
        if page.isdecimal():
            page=int(page)
        else:
            page=1
        self.page=page
        self.start=(page-1)*page_size
        self.end=page*page_size
        self.page_queryset = queryset[self.start:self.end]
        page_count = queryset.count()
        #一共要显示多少页
        page_count, yushu = divmod(page_count, page_size)
        if yushu:
            page_count += 1
        self.page_count=page_count
        self.page_num=page_num

    def page_html(self):
        # 判断数据表当中的数据总共能否展示7页
        if self.page_count <= self.page_num * 2 + 1:
            start_page = 1
            end_page = self.page_count
        else:
            # 当前选中的页面小于三
            if self.page <= self.page_num:
                start_page = 1
                end_page = 2 * self.page_num + 1
            else:
                # 当前选中的页面,如果是最后三页
                if (self.page + self.page_num) > self.page_count:
                    start_page = self.page_count - 2 * self.page_num
                    end_page = self.page_count
                else:
                    start_page = self.page - self.page_num
                    end_page = self.page + self.page_num

        # 存放html代码
        page_list = []
        self.query_dict.setlist(self.page_param,[1])
        if self.page==1:
            #首页
            #上一页
            page_list.append(f'<li class="disabled"><a href="?{self.query_dict.urlencode()}">首页</a></li>')
            page_list.append(f'<li  class="disabled"><a href="?{self.query_dict.urlencode()}">上一页</a></li>')
        else:
            self.query_dict.setlist(self.page_param, [1])
            page_list.append(f'<li><a class="page-first" href="?{self.query_dict.urlencode()}">首页</a></li>')
            self.query_dict.setlist(self.page_param, [self.page - 1])
            page_list.append(f'<li><a href="?{self.query_dict.urlencode()}">上一页</a></li>')
        #页码
        # 定义开始和结束页
        for page_num_ye in range(start_page, end_page + 1):
              if page_num_ye==self.page:
                  self.query_dict.setlist(self.page_param, [page_num_ye])
                  page_list.append(f'<li  class="active"><a href="?{self.query_dict.urlencode()}">{page_num_ye}</a></li>')
              else:
                  self.query_dict.setlist(self.page_param, [page_num_ye])
                  page_list.append(f'<li><a href="?{self.query_dict.urlencode()}">{page_num_ye}</a></li>')

        if self.page < self.page_count:
            self.query_dict.setlist(self.page_param, [self.page +1])
            page_list.append(f'<li><a href="?{self.query_dict.urlencode()}">下一页</a></li>')
            self.query_dict.setlist(self.page_param, [self.page_count])
            page_list.append(f'<li><a class="page-first" href="?{self.query_dict.urlencode()}">尾页</a></li>')
        #下一页
        #尾页
        else:
            page_list.append(f'<li  class="disabled"><a href="?{self.query_dict.urlencode()}">下一页</a></li>')
            page_list.append(f'<li  class="disabled"><a href="?{self.query_dict.urlencode()}">尾页</a></li>')

        #跳转
            # 跳转页
        search_page = f"""
                    <li class="page-jump">
                        <form method="get" class="form-inline">
                            <input type="number" name="{self.page_param}" min="1" value="{self.page}" placeholder="页码" class="form-control">
                            <button type="submit">跳转</button>
                        </form>
                    </li>  """

        page_list.append(search_page)




        # 将字符串传递给前端页面
        page_str = mark_safe(''.join(page_list))
        return page_str

views中引用

python 复制代码
from utils_app.utils.page_data import PageData


#方法中
    userlist = models.UserInfo.objects.filter(**data_dict)
    data =PageData(request,userlist)
    content = {
        'userlist':data.page_queryset,
        'page_str':data.page_html()

    }
    return render(request, "admin/admin.html",content)