1. 例1: 基础的分页
    1). vim app01/views.py
        def users(request):
            from django.core.paginator import Paginator
            curent_page = request.GET.get('p', 1)  # 想获取的页数, 没有指定就返回第一页
            user_list = District.objects.all()
            paginator = Paginator(user_list, 10)  # 每页 10 个数据
            """
            参数:
                object_list : 传入一个对象, 从数据库中取出的数据对象 ,也就是上面的 user_list
                per_page  : 每页的页数
                orphans=0 :
                allow_empty_first_page=True
            """
            # 对象.page(获取的页数)  # 获取指定页数的数据
            obj = paginator.page(curent_page) # 参数为 : 要获取的页数
            # obj 对象中的方法:
            #      {{ obj.has_next }}               是否有下一页
            #      {{ obj.next_page_number }}       下一页页码

#      {{ obj.has_previous }}           是否有上一页
            #      {{ obj.previous_page_number }}   上一页页码

#      {{ obj.object_list }}            分页之后的数据列表
            #      {{ obj.number }}                 当前页
            #      {{ obj.paginator }}   paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法

return render(request, 'index.html', {'obj': obj})

2). vim templates/index.html
        {% for i in page_obj.object_list %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.name }}</td>
                <td>{{ i.password }}</td>
                <td>{{ i.email }}</td>
            </tr>
        {% endfor %}

3). 例1 知识点
        (1): paginator = Paginator(user_list, 10)  对象的参数
        (2): obj = paginator.page(curent_page) 的方法  # 参数为 : 要获取的页数
            obj 对象中的方法:
                {{ obj.has_next }}               是否有下一页
                {{ obj.next_page_number }}       下一页页码

{{ obj.has_previous }}           是否有上一页
                {{ obj.previous_page_number }}   上一页页码

{{ obj.object_list }}            分页之后的数据列表
                {{ obj.number }}                 当前页
                {{ obj.paginator }}   paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法
            注意: 这几个方法不是在 Python 在中使用的, 而是在模板语法中调用的, 如 例 4.3 例子

2. 处理异常
    问题描述
        UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list:
       
/laojia/reboot/opsweb/accounts/views.py:234:
UnorderedObjectListWarning: Pagination may yield inconsistent results
with an unordered object_list: <class
'django.contrib.auth.models.User'> QuerySet.

paginator = Paginator(user_list, self.paginate_by)

这个是因为django,查询出来多条记录时,默认是无序排列的,所以 每查询一次 分页的 list 都是不一样的。

解决方法:
        查询的时候,增加一个排序就可以了
        user_list = Profile.objects.get_queryset().order_by('id')
            或者
        user_list = models.District.objects.all().order_by('id')

但是这样写, 会占用资源

3. 例2:
    3.1. 例二解释
        (1): 处理 ?p 参数 不正确时 报错
        (2): 添加 上一页, 下一页

3.2. 修改视图函数
        def users(request):
            from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
            # 导入 两个 处理报错的 模块
            #   EmptyPage : 处理数字不正却时报错
            #   PageNotAnInteger : 处理不是数字报错

curent_page = request.GET.get('p', 1)  # 想获取的页数, 没有指定就返回第一页

user_list = models.District.objects.all().order_by('id')
            paginator = Paginator(user_list,10)

try:
                page_obj = paginator.page(curent_page)
            except EmptyPage as e:
                page_obj = paginator.page(1)
            except PageNotAnInteger as not_int_err:
                page_obj = paginator.page(1)

return render(request, 'index.html', {'page_obj': page_obj})

4.3. vim templates/index.html
        <center>
            <table border="1" cellspacing="0" width="500">
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>邮箱</th>
                </tr>
                {% for i in page_obj.object_list %}
                <tr>
                    <td>{{ i.id }}</td>
                    <td>{{ i.name }}</td>
                    <td>{{ i.password }}</td>
                    <td>{{ i.email }}</td>
                </tr>
                {% endfor %}
            </table>
            <div>
                {% if page_obj.has_previous  %}
                    <a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
                {% else %}
                    <a href="">上一页</a>
                {% endif %}
                {% if page_obj.has_next  %}
                    <a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
                {% else %}
                    <a href="">下一页</a>
                {% endif %}
            </div>
        </center>

3.4. 例3 知识点总结
        (1): 使用了 列2 中的知识点 paginator.page(curent_page) 中的方法
        (2): 添加了两个议程处理模块

4. 例3:
    4.1. 介绍
        1). 使用 {{ page_obj.paginator }} 的方法
        2). 在页面上添加的页数
        3). 添加页码
        4). 添加 当前页 与 尾页

4.2. 知识点
        1). {{ page_obj.paginator }} : page_obj 就是传到 html 的对象 实际上就是 Paginator() 对象
        2). {{ page_obj.paginator }} : 的方法
            per_page :  每页显示条目数量
            count :    数据总个数
            num_pages : 总页数
            page_range : 总页数的索引范围,如: 如果 总页数是 11, name 这个值就是 (1,12) 由于不取尾的缘故所以 11+1

使用时加 .count 即可, 如 : {{ page_obj.paginator.count }}

4.3. 视图函数不变

4.4. 修改 center 下的 div
        <div>
            {% if page_obj.has_previous  %}
                <a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
            {% else %}
                <a href="">上一页</a>
            {% endif %}
                {# 5.3. 新添加 内容, 显示页码 #}
                {% for i in page_obj.paginator.page_range %}
                    <a href="/users?p={{ i }}">{{ i }}</a>
                {% endfor %}

{% if page_obj.has_next  %}
                <a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
            {% else %}
                <a href="">下一页</a>
            {% endif %}

{# 5.3. 添加 当前页 与 尾页 #}
            <span>{{ page_obj.number }}/</span> {# 当前页 #}
            <span>{{ page_obj.paginator.num_pages }}</span>  {# 总页数 #}
        </div>

4. 缺点
    django 无法解决页码过多的问题, 需要自己进行扩展

python django 之 django自带的分页的更多相关文章

  1. 比Django官方实现更好的分页组件+Bootstrap整合

    前言 Django全家桶自带的分页组件只能说能满足分页这个功能,但是没那么好用就是了 Django的分页效果 django-pure-pagination分页效果 使用方法 首先安装: pip ins ...

  2. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  3. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  4. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  5. Python攻关之Django(一)

    课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...

  6. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  7. Python之路-(Django进阶一)

    Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...

  8. 第六篇:web之python框架之django

    python框架之django   python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...

  9. Django rest framework(7)----分页

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  10. Python web(Django)连接Sql server

    (开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...

随机推荐

  1. [USACO09DEC]音符Music Notes (二分、STL)

    https://www.luogu.org/problem/P2969 题目描述 FJ is going to teach his cows how to play a song. The song ...

  2. CSS样式表-------第二章:选择器

    二 .选择器 内嵌.外部样式表的一般语法: 选择器 { 样式=值: 样式=值: 样式=值: ...... } 以下面html为例,了解区分一下各种样式的选择器 <head> <met ...

  3. winfrom控件圆角

    刚好用到这个功能,看了好些例子.我就不明白,简单的一个事,一些文章里的代码写的那个长啊,还让人看么. 精简后,就其实一点,只要有paint事件的组件,都可画圆角,没有的外面套一个panel就行了. u ...

  4. Cisco路由器配置基本命令

    特权模式:enable Router1 # show running-config Router1 # show ip route Router # show ip interface brief S ...

  5. iOS运营级B2B服务平台App、自定义图标库、个人中心页面、识别身份证Demo、瀑布流等源码

    iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... iOS可自定义图表库 - PNChart 开源一款曾是运营级的B2B服务 ...

  6. python后端面试第八部分:制作简历和如何面试--长期维护

    ###############     就业指导    ################ 这里面有套路,你懂了这个套路,你会找到更好的工作,你会更快的找到工作, ,如何制作简历,五颗星 ,如何投递简历 ...

  7. Python opencv PIL numpy base64互相转化

    PIL2numpy and numpy2PIL from PIL import Image import numpy image = Image.open('timg.jpeg')# image is ...

  8. Mate20 pro实现H265 (HEVC)实时硬件编码

    谁能告诉我手机上用H265实时编码有什么鸟用? 一.先看看手机支持哪些codec ALL_CODECS REGULAR_CODECS mine-type 选择mime-type为video/hevc, ...

  9. linux系统--C语言程序开发的基本步骤(包含gcc的基本步骤)

    1.使用vi或者vim编写程序文件 2.使用gcc把所有的源文件翻译成计算机认识的格式(编译) 3.使用./a.out作为命令执行得到的可执行文件 gcc编译器的工作步骤: 1.处理所有的预处理指令 ...

  10. python Ajax的使用

    转自:http://www.cnblogs.com/python-study/p/6060530.html 1.使用Ajax在后台传递参数的示例 要使用Ajax传递参数,需要使用jquery,使用jq ...