zoukankan      html  css  js  c++  java
  • django框架进阶-分页-长期维护

    ##################   分页    #######################

    分页,
    django有自己内置的分页,但是功能不是很强大,所以自己写一个分页,
    web页面数据非常多的时候,是必须要有分页的,
    分页思路:通过url后面加参数的形式,
    http://127.0.0.1:8000/book_list/?page=1
    
    页面       展示数据  切片
    第一页,1-10       [0-10]        #因为切片下标不包含,
    第二页,11-20      [10-20]
    第三页,21-30     [20-30]
    ...
    第n页,                  [(n-1)*10:n*10]
    all_book = models.Book.objects.all()[data_start:date_end]

    ##################   分页--视图函数    ######################

    def book_list(request):
    
        page_num=request.GET.get("page")
        total_count=models.Book.objects.count()
        from utils.mypage import Page
        page_obj=Page(page_num,total_count,per_page=10,url_prefix="/book_list/",max_page=11)
        ret = models.Book.objects.all()[page_obj.start:page_obj.end]
        page_html=page_obj.page_html()
        return render(request,"book_list2.html",{'all_book': ret, 'page_html': page_html})
    
    #     # 获取页码
    #     page_num = request.GET.get('page')
    #     print(page_num, type(page_num))      # 这个page_num是字符串类型,需要转一下,
    #     # 一页显示多少数据
    #     per_page = 10
    #     # 总数据多少
    #     total_count = models.Book.objects.count()
    #     # 总共需要多少页码来显示
    #     total_page, m = divmod(total_count, per_page)  # divmod(第一个数,第二个数)  得到一个元组,第一个是整除的商,第二个是整除的余数,
    #     if m:
    #         total_page += 1
    #     try:
    #         page_num = int(page_num)
    #         # if page_num>total_page:
    #         #     page_num=total_page
    #     except Exception as e:  # 如果不错这个处理,就会导致报错,
    #         # 输入的页面不是正经的数字的时候返回第一页,
    #         page_num = 1
    #     if page_num > total_page:
    #         page_num=total_page
    #
    #     # 数据开始
    #     data_start = (page_num - 1) * 10
    #     # 数据结束
    #     date_end = page_num * 10
    #     print(data_start, date_end)
    #
    # ##########################################################################
    #     # 页面展示页码的计算
    #
    #     # 页面上总共展示多少页码
    #     # 如果总页码比最大展示页码小,就让总页码最为最大页码
    #     max_page = 11
    #     if total_page < max_page:
    #         max_page = total_page
    #
    #     half_max_page = max_page // 2
    #     # 页码从哪开始
    #     # 比如第6页,就是开始页是6-5,从第1页开始
    #     page_start = page_num - half_max_page
    #     # 页码从哪结束
    #     # 比如第6页,就是开始页是6+5,从第11页结束
    #     page_end = page_num + half_max_page
    #     # 如果当前页减一半比1还小,就有问题了,
    #     # 就把第一页作为开始,把最大的页码数作为最后一页
    #     if page_start <= 1:
    #         page_start = 1
    #         page_end = max_page
    #     # 如果结尾比总页码还大,就有问题了,
    #     # 就把总页码最为最后一页,把总页码减最大展示页面+1,最为最后一页,
    #     if page_end >= total_page:
    #         page_end = total_page
    #         page_start = total_page - max_page + 1
    #
    # #############################################################################
    #     # 自己拼接分页的html
    #     html_str_list = []
    #     # 加第一页
    #     html_str_list.append('<li><a href="/book_list/?page=1">首页</a></li>')
    #     # 加上一页:
    #     if page_num <= 1:
    #         html_str_list.append('<li class="disabled"> <a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
    #     else:
    #         html_str_list.append(
    #             '<li> <a href="/book_list/?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(page_num - 1))
    #
    #     for i in range(page_start, page_end + 1):
    #         # 如果是当前页就加一个active样式,选中,
    #         if i == page_num:
    #             tmp = '<li class="active"><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
    #         else:
    #             tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
    #
    #         html_str_list.append(tmp)
    #
    #     # 加下一页
    #     # 判断如果是最后一页就没有下一页
    #     if page_num >= total_page:
    #         html_str_list.append('<li class="disabled"> <a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
    #     else:
    #         html_str_list.append(
    #             '<li> <a href="/book_list/?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(page_num + 1))
    #
    #     # 最后一页
    #     html_str_list.append('<li><a href="/book_list/?page={0}">尾页</a></li>'.format(total_page))
    #     # 把列表中的html数据拼接
    #     page_html = ''.join(html_str_list)
    #
    # #########################################################################
    #     # 取出所有的书内容
    #     all_book = models.Book.objects.all()[data_start:date_end]  # 切片取前10个
    #     # 在html中渲染数据,就是字符串的替换
    #     return render(request, 'book_list2.html', {'all_book': all_book, 'page_html': page_html})

    ##################   分页--封装    ########################

    class Page():
    
        def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
            """
            输入三个引号回车,就有这些参数了
            :param page_num: 当前页码数
            :param total_count: 数据总数
            :param url_prefix: a标签href的前缀
            :param per_page: 每页显示多少条数据
            :param max_page: 页面上最多显示几个页码
            """
            self.url_prefix = url_prefix
            self.max_page = max_page
            # 每一页显示多少条数据
            # 总共需要多少页码来展示
            total_page, m = divmod(total_count, per_page)
            if m:
                total_page += 1
            self.total_page = total_page
    
            try:
                page_num = int(page_num)
                # 如果输入的页码数超过了最大的页码数,默认返回最后一页
                if page_num > total_page:
                    page_num = total_page
            except Exception as e:
                # 当输入的页码不是正经数字的时候 默认返回第一页的数据
                page_num = 1
            self.page_num = page_num
    
            # 定义两个变量保存数据从哪儿取到哪儿
            self.data_start = (page_num - 1) * 10
            self.data_end = page_num * 10
    
            # 页面上总共展示多少页码
            if total_page < self.max_page:
                self.max_page = total_page
    
            half_max_page = self.max_page // 2
            # 页面上展示的页码从哪儿开始
            page_start = page_num - half_max_page
            # 页面上展示的页码到哪儿结束
            page_end = page_num + half_max_page
            # 如果当前页减一半 比1还小
            if page_start <= 1:
                page_start = 1
                page_end = self.max_page
            # 如果 当前页 加 一半 比总页码数还大
            if page_end >= total_page:
                page_end = total_page
                page_start = total_page - self.max_page + 1
            self.page_start = page_start
            self.page_end = page_end
    
        @property
        def start(self):
            return self.data_start
    
        @property
        def end(self):
            return self.data_end
    
    
        def page_html(self):
            # 自己拼接分页的HTML代码
            html_str_list = []
            # 加上第一页
            html_str_list.append('<li><a href="{}?page=1">首页</a></li>'.format( self.url_prefix))
    
            # 判断一下 如果是第一页,就没有上一页
            if self.page_num <= 1:
                html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.page_num-1))
            else:
                # 加一个上一页的标签
                html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format( self.url_prefix, self.page_num-1))
    
            for i in range(self.page_start, self.page_end+1):
                # 如果是当前页就加一个active样式类
                if i == self.page_num:
                    tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
                else:
                    tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format( self.url_prefix, i)
    
                html_str_list.append(tmp)
    
            # 加一个下一页的按钮
            # 判断,如果是最后一页,就没有下一页
            if self.page_num >= self.total_page:
                html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
            else:
                html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format( self.url_prefix, self.page_num+1))
            # 加最后一页
            html_str_list.append('<li><a href="{}?page={}">尾页</a></li>'.format( self.url_prefix, self.total_page))
    
            page_html = "".join(html_str_list)
            return page_html

    ##################   分页--页面html    #######################

    {#继承母版#}
    {% extends 'base.html' %}
    
    {#把自己页面的内容,放入母版相应的位置,#}
    {% block page-main %}
        <h1 class="page-header">书籍管理页面</h1>
    
        <div class="panel panel-primary">
            <!-- Default panel contents -->
            <div class="panel-heading">出版社列表 <i class="fa fa-thumb-tack pull-right"></i></div>
            <div class="panel-body">
                <div class="row" style="margin-bottom: 15px">
                    <div class="col-md-4">
                        <div class="input-group">
                            <input type="text" class="form-control" placeholder="Search for...">
                            <span class="input-group-btn">
                                        <button class="btn btn-default" type="button">搜索</button>
                                    </span>
                        </div><!-- /input-group -->
                    </div><!-- /.col-md-4 -->
                    <div class="col-md-3 pull-right">
                        <a href="/add_book/" class="btn btn-success">新页面添加</a>
                        <button class="btn btn-success" data-toggle="modal" data-target="#myModal">新增</button>
                    </div>
    
                </div><!-- /.row -->
    
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>#</th>
                        <th>id</th>
                        <th>书名</th>
                        <th>出版社</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for i in all_book %}
                        <tr>
                            <td>{{ forloop.counter }}</td>
                            <td>{{ i.id }}</td>
                            <td>{{ i.title }}</td>
                            <td>{{ i.publisher.name }}</td>
                            {#        这一步很重要,i.publishe是取到的一个对象,i.publishe_id才是一个id#}
                            <td>
                                <a class="btn btn-danger" href="/delete_book/?id={{ i.id }}">删除</a>
                                <a class="btn btn-info" href="/edit_book/?id={{ i.id }}">编辑</a>
                            </td>
                        </tr>
                    {% empty %}
                        <tr>
                            <td colspan="5" class="text-center">暂时没有数据哦~~~~~</td>
                        </tr>
    
                    {% endfor %}
                    </tbody>
                </table>
    
    {#        分页开始     #}
                <nav aria-label="Page navigation" class="text-right">
                    <ul class="pagination">
                        {{ page_html|safe }}
                    </ul>
                </nav>
    {#        分页结束     #}
    
            </div>
    
        </div>
    {% endblock %}

    ##################   分页    #######################

    ##################   分页    #######################

  • 相关阅读:
    nodejs redis数据类型命令汇总
    十大经典排序算法最强总结
    基于Nodejs的Tcp封包和解包的理解
    排序算法 JavaScript
    import和require的区别
    Socket.io的默认事件列表
    非常完整的coco screator socketio
    分布式、集群、微服务、SOA 之间的区别
    关于插入3条数据第三条失败全部回滚的操作
    @Scope注解的详细用法
  • 原文地址:https://www.cnblogs.com/andy0816/p/12198174.html
Copyright © 2011-2022 走看看