zoukankan      html  css  js  c++  java
  • 自定义分页

    Django提供了一些类来管理分页的数据,类位于django/core/paginator.py中

    from django.core.paginator import Paginator
    objects=[]
    for i in range(20):
        objects.append("图书%s"%i)
    p=Paginator(objects,4)  #每页的个数
    print(p.count)  #数据总数
    print(p.num_pages) #总页数
    print(p.page_range) #页码列表
    print(p.page(1)) #第一页的对象
    print(p.page(1).object_list) #['图书0', '图书1', '图书2', '图书3']
    page2=paginator.page(2)
    print(page2.has_next())            #是否有下一页
    print(page2.next_page_number())    #下一页的页码
    print(page2.has_previous())        #是否有上一页
    print(page2.previous_page_number()) #上一页的页码

    1.在py中批量往数据库中加数据

    ##批量添加数据##
    objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]
    # 在数据库中批量创建, 10次一提交
    models.Book.objects.bulk_create(objs,10)
    ###将数据全部删除
    # models.Book.obje

    2.设置分页

    HTML

    <div class="container">
        <table class="table table-bordered">
          <thead>
            <tr>
                <th>序号</th>
                <th>id</th>
                <th>书名</th>
            </tr>
          </thead>
            <tbody>
            {% for book in book_list %}
                <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ book.id }}</td>
                <td>{{ book.title }}</td>
                </tr>
            {% endfor %}
    
            </tbody>
    </table>
    {#分页条#}
    <nav aria-label="Page navigation">
      <ul class="pagination">
    
            {# 没有safe显示会有误     #}
            {{ page_html|safe }}
      </ul>
    </nav>
    </div>
    View Code

    在views设置分页

     1.在页面上将所有数据均显示出来
        book_obj=models.Book.objects.all()
        2.每页显示5条数据
        book_obj = models.Book.objects.all()[0:5]
        3.在地址栏输入要显示的页面,显示出其数据 ?page=2
        num=request.GET.get("page")  #num是字符串
        print(num,type(num))
        num=int(num)
        start=(num-1)*5
        end=num*5
        book_obj = models.Book.objects.all()[start:end]
        return render(request

    加上分页条来设置

    total_count = models.Book.objects.all().count()  # 统计数据的数量
        print("数量为{}".format(total_count))
        per_page = 5  # 每页显示的数量
        total_page, m = divmod(total_count, per_page)  # 如果有余数,就要在得到的整数基础上再加1页
        if m:
            total_page += 1  # 得到数字,不能直接给HTML
        ##自己拼接HTML代码
        html_str_list = []
        for i in range(1, total_page + 1):
            tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
            html_str_list.append(tmp)
        page_html = "".join(html_str_list)  # 标签之间没有逗号
        num = request.GET.get("page")  # num是字符串
        if num:
            num = int(num)
        else:num=1  #如果只在路径上输入/book_list/,不指定页数,就默认显示第一页
        start = (num - 1) * 5
        end = num * 5
        book_obj = models.Book.objects.all()[start:end]
        return render(request,"book_list.html",{"book_list":book_obj,"page_html":page_html})
    View Code

    设置固定的页码数

     total_count = models.Book.objects.all().count()  # 统计数据的数量
        print("数量为{}".format(total_count))
        per_page = 5  # 每页显示的数量
        total_page, m = divmod(total_count, per_page)  # 如果有余数,就要在得到的整数基础上再加1页
        if m:
            total_page += 1  # 得到数字,不能直接给HTML
        num = request.GET.get("page")  # num是字符串
        if num:
            try:
                num = int(num)
                if num>total_page:
                    num=total_page
            ##输入不是数字时,就返回第一页
            except Exception  as e:
                num=1
        else:
            num = 1  # 如果只在路径上输入/book_list/,不指定页数,就默认显示第一页
        start = (num - 1) * 5
        end = num * 5
        book_obj = models.Book.objects.all()[start:end]
    
        ##设置固定的页码数##
        max_page=11
        if total_page<max_page:  #如果页数小于11页
            max_page=total_page
        half_page=max_page//2 #当前页前后的页数
        #页面的开始页码
        start_page=num-half_page
        end_page=num+half_page
        if  start_page<=1:
            start_page=1
            end_page=max_page
        if end_page>total_page:
            start_page=total_page-max_page+1  #如果不加1,会显示12个
            end_page=total_page
        html_str_list = []
        for i in range(start_page, end_page+1):
            tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
            html_str_list.append(tmp)
        page_html = "".join(html_str_list)
        return render(request, "book_list.h
    View Code

    添加首页和尾页,上一页和下一页

    html_str_list = []
        ##添加首页
        html_str_list.append('<li><a href="/book_list/?page=1">首页</a></li>')
        ##添加上一页
        if num<=1:  #如果是页数小于等于1,就没有上一页,就不让选了
            html_str_list.append('<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>')
        else:
            html_str_list.append('<li><a href="/book_list/?page={}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'.format(num-1))
        for i in range(start_page, end_page+1):
            ##如果是当前页,就加个样式类
            if i == 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 num >=total_page:
            html_str_list.append('<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
        else:
            html_str_list.append('<li ><a href="/book_list/?page={}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>'.format(num+1))
        ##添加尾页
        html_str_list.append('<li><a href="/book_list/?page={}">尾页</a></li>'.format(total_page))
        page_html = "".join(html_str_list)
        return render(request, "book_list.html", {"book_list": book_obj, "page_html": page_html})
    View Code

    CBV版分页

    page.py

    """
    分页组件使用示例:
    
        obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info)
        page_user_list = USER_LIST[obj.start:obj.end]
        page_html = obj.page_html()
    
        return render(request,'index.html',{'users':page_user_list,'page_html':page_html})
    
    """
    class Pagination(object):
        def __init__(self,current_page,all_count,base_url,params,per_page_num=20,pager_count=11):
            """
            封装分页相关数据
            :param current_page: 当前页
            :param all_count:    数据库中的数据总条数
            :param per_page_num: 每页显示的数据条数
            :param base_url: 分页中显示的URL前缀
            :param pager_count:  最多显示的页码个数
            """
            try:
                current_page = int(current_page)
            except Exception as e:
                current_page = 1
    
            if current_page <1:
                current_page = 1
    
            self.current_page = current_page
    
            self.all_count = all_count
            self.per_page_num = per_page_num
    
            self.base_url = base_url
            # 总页码
            all_pager, tmp = divmod(all_count, per_page_num)
            if tmp:
                all_pager += 1
            self.all_pager = all_pager
    
    
            self.pager_count = pager_count
            self.pager_count_half = int((pager_count - 1) / 2)
    
    
            # GET请求数据
            import copy
            self.params=copy.deepcopy(params)  # request.GET   {"nid":1}
        @property
        def start(self):
            return (self.current_page - 1) * self.per_page_num
        @property
        def end(self):
            return self.current_page * self.per_page_num
        def page_html(self):
            # 如果总页码 < 11个:
            if self.all_pager <= self.pager_count:
                pager_start = 1
                pager_end = self.all_pager + 1
            # 总页码  > 11
            else:
                # 当前页如果<=5
                if self.current_page <= self.pager_count_half:
                    pager_start = 1
                    pager_end = self.pager_count + 1
                # 当前页大于5
                else:
                    # 页码翻到最后
                    if (self.current_page + self.pager_count_half) > self.all_pager:
                        pager_start = self.all_pager - self.pager_count + 1
                        pager_end = self.all_pager + 1
                    else:
                        pager_start = self.current_page - self.pager_count_half
                        pager_end = self.current_page + self.pager_count_half + 1
            page_html_list = []
            page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
            first_page = '<li><a href="/%s?page=%s">首页</a></li>' % (self.base_url,1,)
            page_html_list.append(first_page)
            if self.current_page <= 1:
                prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
            else:
                prev_page = '<li><a href="/%s?page=%s">上一页</a></li>' % (self.base_url,self.current_page - 1,)
            page_html_list.append(prev_page)
            for i in range(pager_start, pager_end):
                self.params["page"]=i
                if i == self.current_page:
                    temp = '<li class="active"><a href="/%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
                else:
                    temp = '<li><a href="/%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
                page_html_list.append(temp)
    
            if self.current_page >= self.all_pager:
                next_page = '<li class="disabled"><a href="#">下一页</a></li>'
            else:
                next_page = '<li><a href="/%s?page=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,)
            page_html_list.append(next_page)
    
            last_page = '<li><a href="/%s?page=%s">尾页</a></li>' % (self.base_url,self.all_pager,)
            page_html_list.append(last_page)
            page_html_list.append('</ul></nav>')
            return ''.join(page_html_list)
    View Code

    HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    
    <ul>
        {% for book in book_list %}
        <li>{{ book.title }}----{{ book.price }}</li>
        {% endfor %}
    
    </ul>
    
    
    {{ pagination.page_html|safe }}
    
    
    
    </body>
    </html>
    html
    from app01 import models
    
    def index(request):
          book_list=models.BooK.objects.all()
        from app01.page import Pagination
        current_page=request.GET.get("page")
    
        pagination=Pagination(current_page,book_list.count(),"index",request.GET,per_page_num=5)
    
        book_list=book_list[pagination.start:pagination.end]
    
        return render(request,"index.html",locals())
    View
    import pymysql
    conn =pymysql.connect(host="10.110.1.90",
                          port=3306,
                          user="php",
                          password="MySQL57.huayingjuhe.com",
                          database="fdm",
                          charset="utf8mb4"
                          )
    
    cursor =conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    def pageinfo(page=1, pagesize=20, total=0 ):
        """只显示五页的页码"""
        page = int(page)
        if page <= 0 :
            page = 1
    
        pagesize = int(pagesize)
        if pagesize <= 0 :
            pagesize = 20
    
        total = int(total)
        totalpage = abs(((-1) * total)// pagesize )
        if page > totalpage and totalpage > 0:
            page = totalpage
    
        offset = (page - 1) * pagesize
    
        d = {"page" : page, "pagesize" : pagesize, "offset" : offset, "total" : total }
    
        d["first"] = 1
        d["prev"] = page - 1 if(page > 1) else 1
        d["next"] = page + 1 if(page < totalpage) else totalpage
        d["last"] = totalpage
    
        l = []
        i = -4
        while i < 5 :
            if page + i  >= 1 and page +i <= totalpage :
                l.append(page + i )
            i = i + 1
        d["links"] = l
    
        return d
    
    
    def get_movie_projects(name=None, page=1,pagesize=20):
        """分页显示"""
    
        where = [" id > %s "]
        args = [0]
    
        if name != None :
            where.append(" and ( pid = %s  or name like %s ) ")
            args.append(name)
            args.append('%'+name+'%')
    
        sql = "select count(*) as row_num from fdm_project where %s " % (''.join(where))
        row = cursor.execute(sql,tuple(args,))
        r = cursor.fetchall()
        total = r[0]["row_num"]
        page_info = pageinfo(page,pagesize,total)
        sql = "select *  from fdm_project where %s order by id desc limit %s offset %s " % (''.join(where),page_info["pagesize"],page_info["offset"] )
        row = cursor.execute(sql,tuple(args))
        project = cursor.fetchall()
    
        return {"pageinfo":page_info,"project":project}
    
    print(get_movie_projects())
  • 相关阅读:
    13-02 Java 数组高级算法,Arrays类
    从0移植uboot (二) _uboot启动流程分析
    Linux input子系统编程、分析与模板
    跟着内核学框架-从misc子系统到3+2+1设备识别驱动框架
    Linux驱动技术(八) _并发控制技术
    Linux驱动技术(七) _内核定时器与延迟工作
    Linux驱动技术(六) _内核中断
    Linux驱动技术(五) _设备阻塞/非阻塞读写
    Linux驱动技术(四) _异步通知技术
    Linux驱动技术(三) _DMA编程
  • 原文地址:https://www.cnblogs.com/zgf-666/p/9136112.html
Copyright © 2011-2022 走看看