zoukankan      html  css  js  c++  java
  • django 分页

    已经封装成包,使用时导入即可

    实现:

    class MyPage:
        def __init__(self, url, info_count, page_num, info_num=10, max_page=11, ):
            """
            :param url: 请求的url
            :param info_count: 总共有多少条数据
            :param page_num: 访问的页码
            :param info_num: 展示多少条数据
            :param max_page: 展示多少条页码
            """
    
            self.url = url
            self.info_count = info_count
            try:
                page_num = int(page_num)
            except Exception as e:
                page_num = 1
            self.info_num = info_num
            self.page_num = page_num
            self.max_page = max_page
            page_count, m = divmod(self.info_count, self.info_num)
            if m:
                page_count += 1
                self.page_count = page_count
            else:
                self.page_count = page_count
    
            start_info = (self.page_num - 1) * self.info_num
            end_info = start_info + self.info_num
    
            self.start_info = start_info
            self.end_info = end_info
    
            half_max_page = self.max_page // 2
            start_page = self.page_num - half_max_page  # 开始页码
            end_page = self.page_num + half_max_page  # 结束页码
    
            # 如果可以显示的页码总数少于设置的展示页码数,展示的页码数默认为可以显示的页码总数
            if self.page_count < self.max_page:
                self.start_page = 1
                self.max_page = self.page_count
    
            # 如果开始页码小于1,则开始页码为1 , 结束页码为最可以显示的页码数
            if start_page < 1:
                start_page = 1
                end_page = self.max_page
    
            # 如果结束页码大于页码总数,则结束页码为页码总数,开始页码则为页码总数减去规定的可以显示的页码数+1
            if end_page > page_count:
                end_page = page_count
                start_page = end_page - self.max_page + 1
    
            self.start_page = start_page
            self.end_page = end_page
    
        @property
        def start(self):
            return self.start_info
    
        @property
        def end(self):
            return self.end_info
    
        def page_html(self):
            info_list = []
            # 添加一个首页标签
            first_page = '<li><a href="{}?next=1">首页</a></li>'.format(self.url)
            info_list.append(first_page)
    
            # 添加一个上一页标签,如果是第一页,标签不能点击
            if self.page_num <= 1:
                next_page = '<li class="disabled"><a href="{}?next={}" aria-abel="Previous"><spanaria-hidden="true">&laquo;</span></a></li>'.format(self.url,
                    self.page_num)
                info_list.append(next_page)
            else:
                next_page = '<li><a href="{}?next={}" aria-abel="Previous"><spanaria-hidden="true">&laquo;</span></a></li>'.format(self.url, self.page_num - 1)
                info_list.append(next_page)
    
            for i in range(self.start_page, self.end_page + 1):
                li = '<li><a href="{}?next={}">{}</a></li>'.format(self.url, i, i)
                info_list.append(li)
    
            # 添加一个下一页标签,如果是最后一页,标签不能点击
            if self.page_num == self.page_count:
                next_page = '<li class="disabled"><a href="{}?next={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(self.url, self.page_num)
                info_list.append(next_page)
            else:
                next_page = '<li><a href="{}?next={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(self.url, self.page_num + 1)
                info_list.append(next_page)
    
            # 添加一个尾页标签
            trailer_page = '<li><a href="{}?next={}">尾页</a></li>'.format(self.url, self.page_count)
            info_list.append(trailer_page)
            
            str_info_list = ''.join(info_list)  # 将存有页数的HTML标签列表转换成字符串形式
            return str_info_list
    分页

    用法:

    # 导入源码包 
    def show_book(request):
        # all_book = models.Book.objects.all()
        # return render(request, 'show/show_book.html', {'all_book': all_book})
        # 总共有多少条数据
        info_count = models.Book.objects.all().count()
        # 获取页码,默认为1
        page_num = request.GET.get('next', 1)
        # 获取客户端url地址,不包括域名
        url = request.path_info
        # 创建分页对象
        obj_page = paging.MyPage(url=url, info_count=info_count, page_num=page_num, info_num=8, max_page=7)
        # 展示哪些条数据
        info = models.Book.objects.all()
        all_book = info[obj_page.start:obj_page.end]
        # 获取分页HTML代码
        str_info_list = obj_page.page_html()
        return render(request, 'show/show_book.html', {'all_book': all_book, 'str_info_list': str_info_list})
    paging.py
                    <nav aria-label="Page navigation">
                        <ul class="pagination">
                            {{ str_info_list|safe }}
                        </ul>
                    </nav>
    HTML

    进阶:实现url地址中的搜索条件不会被清空,再添加一个参数即可,值为request.GET,对应标签地址应该重构。其余使用方法一致

    import copy
    class MyPage:
        def __init__(self, url, info_count, page_num, request_get_params, info_num=10, max_page=11, ):
            """
            :param url: 请求的url
            :param info_count: 总共有多少条数据
            :param page_num: 访问的页码
            :param info_num: 展示多少条数据
            :param max_page: 展示多少条页码
            :param request_get_params: 用于url中的筛选条件不清空,以request.GET传入
            """
    
            self.url = url
            self.info_count = info_count
            try:
                page_num = int(page_num)
            except Exception as e:
                page_num = 1
    
    
            self.info_num = info_num
            self.page_num = page_num
            self.max_page = max_page
            page_count, m = divmod(self.info_count, self.info_num)
            if m:
                page_count += 1
                self.page_count = page_count
            else:
                self.page_count = page_count
    
            start_info = (self.page_num - 1) * self.info_num
            end_info = start_info + self.info_num
    
            self.start_info = start_info
            self.end_info = end_info
    
            half_max_page = self.max_page // 2
            start_page = self.page_num - half_max_page  # 开始页码
            end_page = self.page_num + half_max_page  # 结束页码
    
            # 如果可以显示的页码总数少于设置的展示页码数,展示的页码数默认为可以显示的页码总数
            if self.page_count < self.max_page:
                self.start_page = 1
                self.max_page = self.page_count
    
            # 如果开始页码小于1,则开始页码为1 , 结束页码为最可以显示的页码数
            if start_page < 1:
                start_page = 1
                end_page = self.max_page
    
            # 如果结束页码大于页码总数,则结束页码为页码总数,开始页码则为页码总数减去规定的可以显示的页码数+1
            if end_page > page_count:
                end_page = page_count
                start_page = end_page - self.max_page + 1
    
            self.start_page = start_page
            self.end_page = end_page
    
            params = copy.deepcopy(request_get_params)
            params._mutable = True
            self.params = params
    
    
    
        @property
        def start(self):
            return self.start_info
    
        @property
        def end(self):
            return self.end_info
    
        def page_html(self):
            info_list = []
            # 添加一个首页标签
            self.params["next"] = 1
            first_page = '<li><a href="{}?{}">首页</a></li>'.format(self.url, self.params.urlencode())
            info_list.append(first_page)
    
            # 添加一个上一页标签,如果是第一页,标签不能点击
            if self.page_num <= 1:
                next_page = '<li class="disabled"><a href="{}?{}" aria-abel="Previous"><spanaria-hidden="true">&laquo;</span></a></li>'.format(
                    self.url,
                    self.params.urlencode())
                info_list.append(next_page)
            else:
                self.params["next"] = self.page_num - 1
                next_page = '<li><a href="{}?{}" aria-abel="Previous"><spanaria-hidden="true">&laquo;</span></a></li>'.format(
                    self.url, self.params.urlencode())
                info_list.append(next_page)
    
            for i in range(self.start_page, self.end_page + 1):
                self.params["next"] = i  # 第一次进来self.params为空,需要添加一个页码键值对
                # li = '<li><a href="{}?next={}">{}</a></li>'.format(self.url, i, i)
                li = '<li><a href="{}?{}">{}</a></li>'.format(self.url, self.params.urlencode(), i)
                info_list.append(li)
    
            # 添加一个下一页标签,如果是最后一页,标签不能点击
            if self.page_num == self.page_count:
                next_page = '<li class="disabled"><a href="{}?{}"><span aria-hidden="true">&raquo;</span></a></li>'.format(
                    self.url, self.params.urlencode())
                info_list.append(next_page)
            else:
                self.params["next"] = self.page_num + 1
                next_page = '<li><a href="{}?{}"><span aria-hidden="true">&raquo;</span></a></li>'.format(self.url,
                                                                                                          self.params.urlencode())
                info_list.append(next_page)
    
            # 添加一个尾页标签
            self.params["next"] = self.page_count
            trailer_page = '<li><a href="{}?{}">尾页</a></li>'.format(self.url, self.params.urlencode())
            info_list.append(trailer_page)
    
            str_info_list = ''.join(info_list)  # 将存有页数的HTML标签列表转换成字符串形式
            return str_info_list
    分页
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/aizhinong/p/12253018.html
Copyright © 2011-2022 走看看