zoukankan      html  css  js  c++  java
  • 七.数据分页原理,paginator与page对象

    1.分页:
        Paginator对象 
        Page对象
    2.Paginator:
    class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
    Required arguments:
    - object_list
    - per_page  每页显示多少条
    Optional arguments:
    - orphans
    - allow_empty_Òrst_page
    属性:
    - Paginator.count 所有页面的objects总数
    - Paginator.num_pages 页面总数
    - Paginator.page_range 页码的范围,从1开始,例如[1, 2, 3, 4]
    方法:
    - Paginator.page(number) 返回一个page对象,number, 当前显示的是第几页
     
    3.Page:
    class Page(object_list, number, paginator)
    属性:
    - Page.object_list 当前页面的对象列表
    - Page.number 当前页的序号,从1开始
    - Page.paginator Paginator对象
    方法
    - Page.has_next() 如果有下一页,返回True
    - Page.has_previous() 如果有上一页,返回 True
    - Page.has_other_pages() 如果有上一面或下一页,返回True
    - Page.next_page_number() 返回下一页的页码。如果不存在,抛出InvalidPage异常
    - Page.previous_page_number() 返回上一页的页码。如果不存在,抛出InvalidPage异常
    - Page.start_index() 返回当前页上的第一个对象,相对于分页列表的所有对象的序号
    - Page.end_index() 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号
    
    
    1.小案例:一次建立1000个用户:
    (python36env) [vagrant@CentOS7 devops]$ python manage.py shell

    In [1]: from django.contrib.auth.models import User

    In [2]: username = "rock"

    In [3]: for i in range(1000):
    ...: name = "{}_{}".format(username, i)
    ...: User.objects.create_user(name, "{}@51reboot.com".format(name), "123456")

    2.查询用户

    In [2]: User.objects.all()   查询出所有用户/只是不会全列完

    In [3]: User.objects.all()[:10] 前十条

    In [4]: queryset = User.objects.all()[:10]  -->1.取数据

    In [5]: queryset.values()   这样就可把所有的数据转换出来如下图

    In [10]: queryset.values("username", "email")    --->2.取部分字段
    <QuerySet [{'username': 'devops', 'email': '123@qq.com'}, {'username': 'rock', 'email': 'rock@51reboot.com'}, {'username': 'rock_0', 'email': 'rock_0@51reboot.com'},。。。。。}]>

    In [11]: list(queryset.values("username", "email"))   --->3.转换成json(这样的数据可直接给httpresponse对象)再返回给浏览器
    Out[11]:
    [{'username': 'devops', 'email': '123@qq.com'},
    {'username': 'rock', 'email': 'rock@51reboot.com'},
    {'username': 'admin', 'email': 'admin@51reboot.com'},
    {'username': 'rock_0', 'email': 'rock_0@51reboot.com'},

    3.我要的是在前端传第几页?page参数就能返回第几页的数据:

    1.拿到page => str类型  要转int

    2.获取数据:

      User.objects.all()

    3.对数据进行处理,分页--根据传的page值来计算切片的开头和结尾:

      queryset = User.objects.all()[start:end]

    4.转json:

      ret = list(queryset.values("id","username","email"))

    5.返回httpresponse对象:

    views.py中:

    from django.views import View
    class MyView(View):
        def get(self,request,*args,**kwargs):
            per = 10
            try:#转的过程可能会出错如果出错就让page等于1
               page = int(request.GET.get("page",1))
            except:
                page = 1
            end = page * 10
            start = end - 10
            queryset = User.objects.all()[start:end]
            data = list(queryset.values("id","username","email"))
            return JsonResponse(data, safe=False)

    dashboard/urls.py中:

    from django.conf.urls import include, url
    from .views import MyView
    urlpatterns = [
        url(r'^hello/', MyView.as_view()),
    ]

    启动效果如图:

     4.分页面展示出提示搜索结果有多少条记录/共有多少页/下上一页/首页/尾页---paginator对象

    https://devdocs.io/   神奇的文档网,可以在此参考

    (python36env) [vagrant@CentOS7 devops]$ python manage.py shell
    In [13]: queryset = User.objects.all()                                               
    In [14]: from django.core.paginator import Paginator
    In [15]: paginator = Paginator(queryset, 10)   实例化对象
    In [16]: paginator.count               总共有多少条                                            
    Out[16]: 1003
    In [17]: paginator.num_pages              总共有多少页                                           
    Out[17]: 101
    In [18]: paginator.page_range                页码范围                                        
    Out[18]: range(1, 102)

    In [19]: page = paginator.page(10)  #实例化page对象当前页是第十页

    In [20]: page.number
    Out[20]: 10

    In [21]: page.next_page_number()
    Out[21]: 11

  • 相关阅读:
    损失函数
    numpy中的broadcast
    混合模型
    贝叶斯学习
    python3中输出不换行
    C++11 实现 argsort
    Python中的闭包
    C语言 fread()与fwrite()函数说明与示例
    DFT与傅里叶变换的理解
    MISRA C:2012 Dir-1.1(只记录常犯的错误和常用的规则)Bit-fields inlineC99,NOT support in C90 #pragma
  • 原文地址:https://www.cnblogs.com/dbslinux/p/13041914.html
Copyright © 2011-2022 走看看