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. Java Web实现用户登录界面

    一.学习Java Web需要的技术: Java语言基础:算法基础.常用数据结构.编程规范. 掌握常见的数据结构和实用算法:培养良好的编程习惯. Java面向对象:封装.继承.多态等,面向对象程序设计, ...

  2. MonkeyScript常用命令及Uiautomatorview问题解决

    一.MonkeyScript执行脚本的命令 adb shell monkey -f <scriptfile><event-count> 1.Dispatch Trackball ...

  3. Servlet中转发和重定向的路径问题以及表单提交路径问题

    一.请求转发与响应重定向的种类 有两种方式获得Servlet转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher() ...

  4. java后台使用HttpServletRequest接收参数转换为model

    当前端需要传图片时,后台用MultipartHttpServletRequest接收参数,request接收过来的参数有很多弊端,需要包装成自己的model就得做转化 弊端: 1.所接收的参数类型无法 ...

  5. git 代理配置方式

    # 设置ss git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'soc ...

  6. warning: LF will be replaced by CRLF in ** 的原因及解决办法

    https://blog.csdn.net/man_zuo/article/details/88651416

  7. Serializable 接口(序列化)

    目录 Serializable 接口(序列化) 前言 用途 如何实现 异常 serialVersionUID transient关键字 Serializable 接口(序列化) 前言 查看API文档时 ...

  8. spring学习笔记四:AOP

    AOP(Aspect Orient Programming),面向切面编程,是对面向对象编程OOP的一种补充 面向对象编程使用静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程 AOP ...

  9. 吴裕雄--天生自然HTML学习笔记:HTML 表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '2.34435678977654336E17' in column '3' is outside valid range for the datatype INTEGER.

    ### Error querying database. Cause: java.lang.reflect.UndeclaredThrowableException### The error may ...