栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django自定义分页器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django自定义分页器

使用的时候只需要调用该分页器类实例化对象,传入下面两个参数

1.请求
2.分页数据即可

并调用对象的html方法得到返回值返回给HTMl即可

可以与查询配合使用,但是跳转的时候未保存原来的查询字符串的内容,所以跳转的时候仍然会显示查询之前的结果。。。。。。。。

"""
自定义的分页组件
使用方法:
    views中
        def number_list(request):
            if request.method == 'GET':
                # 根据条件筛选需要的数据
                numbers = PrettyNumber.objects.all().order_by('-level')

                # 调用分页器类进行自动分页 生成分页器对象 调用html方法 渲染页面即可
                page_obj = Pagination(request, numbers)
                page_string = page_obj.html()
                return render(request, 'number_list.html', locals())
    html中
        
        {% for i in page_obj.page_queryset %}
            
                 {{ i.id }}
                 {{ i.mobile }}
                 {{ i.price }}
                {{ i.get_level_display }}
                {{ i.get_status_display }}
                
                    { i.id }}">编辑
                    { i.id }}">删除
                
            
        {% endfor %}

        
        

"""
from django.utils.safestring import mark_safe


class Pagination(object):
    def __init__(self, request, queryset, page_size=10, page_params='page', plus=5):
        """
        request:请求
        queryset:需要分页符合条件的数据
        page_size:每页数据个数 默认为10
        page_params:查询字符串的名称 默认为page
        plus:每页前面显示几页 后面显示几页
        """
        page = request.GET.get(page_params, 1)

        from django.http.request import QueryDict
        import copy
        query_dic = copy.deepcopy(request.GET)              # 默认request.GET不能修改,深拷贝一份就可以修改
        query_dic._mutable = True                           # 还需要该改下 拷贝出来的._mutable属性
        self.page_params = page_params                      # 设置 page_params 分页查询字符串的key
        self.query_dic = query_dic                          # 设置 query_dic拷贝出来的复件 为 属性
        # query_dic.setlist('page', [1111])
        # print(request.GET.urlencode())

        # 如果是一个十进制规范数字 当前页码为规范数字
        try:
            page.isdigit()
            page = int(page)
            print(page, type(page))
        # 不是 规范输入 设置当前页码为1
        except:
            page = 1
        self.page = page                                    # 当前页面
        self.page_size = page_size                          # 每页多少条数据
        self.start = (page - 1) * page_size                 # 从第几条数据开始切片
        self.end = page * page_size                         # 切片到第几条数据
        self.page_queryset = queryset[self.start:self.end]  # 每页数据的内容

        # 总的数据数量
        self.total_count = queryset.count()
        total_page_count, div = divmod(self.total_count, self.page_size)
        if div:
            total_page_count += 1
        self.total_page_count = total_page_count            # 总页码页码数量
        self.plus = plus                                    # 展示前几条 后几条数据

    def html(self):
        # 定义一个page_str_list用来装载html数据
        page_str_list = []

        # 数据库数据比较少 没有达到11页 即 2*plus + 1页  显示的内容设置为固定显示
        if self.total_page_count <= 2 * self.plus + 1:
            start_page = 1
            end_page = self.total_page_count
        # 数据库的数据比较多,达到11页,考虑小时候的极值,和大时候的极值判断 设置对应的显示内容为固定显示开始或者结束
        else:
            # 小的时候的极值 设置起始页面为1 结束页面动态选择
            if self.page <= self.plus:
                start_page = 1
                end_page = 2 * self.plus + 1
            # 当前页 > 5 (plus)
            else:
                # 判断大的时候的极值 当前页+plus>最大页面数的时候出问题 设置起始页面为最大页面数-2*plus 结束页码为最大页码数
                if (self.page + self.plus) > self.total_page_count:
                    start_page = self.total_page_count - 2 * self.plus
                    end_page = self.total_page_count
                # 否则中间正常显示即可
                else:
                    start_page = self.page - self.plus
                    end_page = self.page + self.plus

        # ?后面的查询字符串
        self.query_dic.setlist(self.page_params, [1])

        # 首页 html标签                                                     注意不能添加查询字符串前面的url,否则其他的就不能使用
        home_page = '
  • HomePage'.format(self.query_dic.urlencode()) page_str_list.append(home_page) # 上一页 html标签 if self.page <= 1: self.query_dic.setlist(self.page_params, [1]) prev = '
  • Previous'.format(self.query_dic.urlencode()) else: self.query_dic.setlist(self.page_params, [self.page-1]) prev = '
  • Previous'.format(self.query_dic.urlencode()) page_str_list.append(prev) # 中间页码 html标签 for i in range(start_page, end_page + 1): # for range前取后不取,所以需要给结束页码+1 self.query_dic.setlist(self.page_params, [i]) if i == self.page: # active 为深蓝色选中状态 ele = '
  • {}'.format(self.query_dic.urlencode(), i) else: # 需要标记该字符串为安全的 导入marksafe 后面为字符串的格式化 ele = '
  • {}'.format(self.query_dic.urlencode(), i) page_str_list.append(ele) # 下一页 html标签 if self.page >= self.total_page_count: self.query_dic.setlist(self.page_params, [self.total_page_count]) Next = '
  • Next'.format(self.query_dic.urlencode()) else: self.query_dic.setlist(self.page_params, [self.page + 1]) Next = '
  • Next'.format(self.query_dic.urlencode()) page_str_list.append(Next) # 尾页 html标签 self.query_dic.setlist(self.page_params, [self.total_page_count]) trailer_page = '
  • TrailerPage'.format(self.query_dic.urlencode()) page_str_list.append(trailer_page) # 搜索 html标签 search_string = """
    """ page_str_list.append(search_string) # 将page_string传递给后端 page_string = mark_safe("".join(page_str_list)) return page_string
  • views
    def number_list(request):
        """靓号列表 + 靓号搜索 + 分页"""
        if request.method == 'GET':
    
            # 查询
            data_dict = {}
            value = request.GET.get('q', '')
            # 查询到数据
            if value:
                data_dict['mobile__contains'] = value
                # 查询到数据库符合条件的一共有多少数据
                numbers = PrettyNumber.objects.filter(**data_dict).order_by('-level')
            # 查询框为空
            else:
                # 查询数据库总的数据
                numbers = PrettyNumber.objects.all().order_by('-level')
    
            # 调用分页器类进行自动分页
            page_obj = Pagination(request, numbers)
            page_string = page_obj.html()
            return render(request, 'number_list.html', locals())
    
    HTML
                   
    
    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/738424.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号