django中orm分页功能(内置分页)

简介:

分批获取数据的方法

数据库方法

models.Uinfo.objects.all()[10:20]

django自带的方法

创建一个新的url

urlpatterns = [
    url(r'^index.html/', views.index),
]

创建index函数

def index(request):
    """
    分页功能
    :param request:
    :return:
    """
    user_list = models.Uinfo.objects.all()#获取到数据
    return render(request,'index.html',{'user_list':user_list})#返回到index页面上显示

创建index.html页面

在templates目录下面创建index页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <h1>用户列表</h1>
    <ul>
        {% for user in user_list %}
            <li>{{ user.name }}</li>
        {% endfor %}

    </ul>
</body>
</html>

浏览器访问

通过浏览器访问可以看到结果都显示到了index的页面上
django中orm分页功能(内置分页)

存在的问题

通过浏览器访问,发现所有的用户都显示到了页面上,但是有一个问题,如果数据库中有上千,百万个数据,这一个页面要全部显示出来是很卡,也很不好。那么如何解决这些问题那。

给数据库添加数据

def index(request):
        #下面的for循环是给数据库中添加200条数据
    for i in range(200):
        name = "root" + str(i)
        models.Uinfo.objects.create(name=name,age=18,ut_id=1)
    user_list = models.Uinfo.objects.all()
    return render(request,'index.html',{'user_list':user_list})

在index函数里面写入上面代码后,重新浏览器访问index.html,让数据库生成上面的数据。

使用django的paginator分页

def index(request):
    """
    分页功能
    :param request:
    :return:
    """
    # for i in range(200):
    #     name = "root" + str(i)
    #     models.Uinfo.objects.create(name=name,age=18,ut_id=1)
    from django.core.paginator import Paginator,Page#导入模块
    current_pagnum = request.GET.get('page')
    user_list = models.Uinfo.objects.all()
    paginator = Paginator(user_list,10)
        #创建一个对象paginator,又有这是一个对象,所以可以通过点“.”来调用一些功能
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    posts = paginator.page(number=current_pagnum)#这个num就是现实当前第几页
    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    # paginator             paginator对象
    return render(request,'index.html',{'posts':posts}) 

index页面的修改

    <ul>
        {% for user in posts.object_list %}#使用的上上post对象object_list功能
            <li>{{ user.name }}</li>
        {% endfor %}

完成上面的代码,浏览器访问http://127.0.0.1:8000/index.html/?page=1传入参数page,就能访问到10条数据
django中orm分页功能(内置分页)

上一页下一页功能

下一页功能

修改index.html页面的代码

<body>
    <h1>用户列表</h1>
    <ul>
        {% for user in posts.object_list %}
            <li>{{ user.name }}</li>
        {% endfor %}
    </ul>
    <div>
        {% if posts.has_next %}
            <a href="/index.html/?page={{ posts.next_page_number }}">下一页</a>

        {% endif %}
    </div>
</body>

上一页功能

<body>
    <h1>用户列表</h1>
    <ul>
        {% for user in posts.object_list %}
            <li>{{ user.name }}</li>
        {% endfor %}
    </ul>
    <div>
        {% if posts.has_previous %}
            <a href="/index.html/?page={{ posts.previous_page_number }}">上一页</a>
        {% endif %}
        {% if posts.has_next %}
            <a href="/index.html/?page={{ posts.next_page_number }}">下一页</a>
        {% endif %}
    </div>
</body>

判断url输入page不是整数

当访问连接是:http://127.0.0.1:8000/index.html/?page=dfa page传递的一个参数是一个非数字的时候,我们这个时候可以使用try来抓补异常来处理

 from django.core.paginator import Paginator,Page,PageNotAnInteger#首先把这个异常导入进来
     try:
        posts = paginator.page(number=current_pagnum)#这个num就是现实当前第几页
    except PageNotAnInteger:
        posts = paginator.page(number=1)

如果page传递过来的是一个负数eg:-1,虽然不是字符串,但是也要报错,这个时候也是可以抓捕异常的
django中orm分页功能(内置分页)

页码的功能

        {% for num in posts.paginator.page_range %}#在posts对象里面有一个paginator对象,这个对象的下面有一个页码范围page_range,通过连续的导入使用
            <a href="/index.html/?page={{ num }}">{{ num }}</a>
        {% endfor %}

django中orm分页功能(内置分页)
但是django不适合用来加页码,因为他会全部都显示出来

自己定义分页

创建路由和函数

 url(r'^custom.html/', views.custom),
def custom(request):
    #获取当前页
    current_page = request.GET.get('page')
    current_page = int(current_page)
    #每页显示10条
    per_page = 10
    #1,0-10
    #2,10-20
    #3,20-30
    start_page = (current_page -1) * per_page
    end_page = current_page * per_page
    user_list = models.Uinfo.objects.all()[start_page:end_page]
    return render(request,'custom.html',{'user_list':user_list})

创建页面

<body>
    <ul>
        {% for user in user_list %}
            <li>{{ user.name }}</li>

        {% endfor %}

    </ul>
</body>

结果

通过http://127.0.0.1:8000/custom.html/?page=2 输入不同的数字显示页码,后台通过转换

代码优化

初始化的东西,创建一个类,全部放在类中操作

class PageInfo(object):
    def __init__(self,current_page,per_page):
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1
        self.per_page = per_page

    def start(self):
        return (self.current_page -1)*self.per_page

    def end(self):
        return self.current_page * self.per_page
def custom(request):
    page_info = PageInfo(request.GET.get('page'),10)
    user_list = models.Uinfo.objects.all()[page_info.start():page_info.end()]
    return render(request,'custom.html',{'user_list':user_list})

添加自定义页码功能

类中的代码

django中orm分页功能(内置分页)

函数中的代码

django中orm分页功能(内置分页)

页面中的代码

django中orm分页功能(内置分页)

浏览结果

django中orm分页功能(内置分页)

对上面的浏览结果优化下

django中orm分页功能(内置分页)

添加选中当前页的背景色

django中orm分页功能(内置分页)
django中orm分页功能(内置分页)

固定显示页数

django中orm分页功能(内置分页)
django中orm分页功能(内置分页)
但是这个是有bug的,如果前面没有页数了,会显示负数

优化显示的页数

   def pager(self):
        page_list =[]
        half_page = int((self.show_page -1)/2)

        if self.all_pages < self.show_page:
            start_showpage = 1
            stop_showpage = self.all_pages + 1
        else:
            if self.current_page <= half_page:
                start_showpage = 1
                stop_showpage = self.show_page +1
            else:
                if self.current_page + half_page > self.all_pages:
                    start_showpage = self.all_pages - self.show_page + 1
                    stop_showpage = self.all_pages + 1
                else:
                    start_showpage = self.current_page - half_page
                    stop_showpage = self.current_page + half_page + 1
        if self.current_page <=1:
            prev_page = "<a style='display:inline-block;padding:5px;marign:5px;' href='#'>上一页</a>"
        else:
            prev_page = "<a style='display:inline-block;padding:5px;marign:5px;' href='/custom.html/?page=%s'>上一页</a>" %(self.current_page -1)
        page_list.append(prev_page)
        # for num in range(1,self.all_pages+1):
        for num in range(start_showpage,stop_showpage):
            if num == self.current_page:
                temp = "<a style='display:inline-block;padding:5px;marign:5px;background-color:red;' href='/custom.html/?page=%s'>%s</a>" % (
                num, num,)
            else:
                temp="<a style='display:inline-block;padding:5px;marign:5px;' href='/custom.html/?page=%s'>%s</a>" %(num,num,)
            page_list.append(temp)

        if self.current_page >self.all_pages:
            next_page = "<a style='display:inline-block;padding:5px;marign:5px;' href='#'>下一页</a>"
        else:
            next_page = "<a style='display:inline-block;padding:5px;marign:5px;' href='/custom.html/?page=%s'>下一页</a>" %(self.current_page +1)
        page_list.append(next_page)

        return "".join(page_list)

结果显示

django中orm分页功能(内置分页)

优化url自动

通过占位符,来动态的生成url。首先给一个参数位置
django中orm分页功能(内置分页)
把a标签中的href修改成占位符
django中orm分页功能(内置分页)
传递参数的时候传入url
django中orm分页功能(内置分页)

通过bootstrip来美化分页

首先导入bootstrip到项目中

<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">

https://v3.bootcss.com/components/#pagination

可以看到文档介绍的都是ul,li格式的分页,而我们开始使用的是a标签,所以下面我们要把我们的a标签改成li形式的
django中orm分页功能(内置分页)
全部改成li标签后,我们在页面上引用

<body>
    <ul>
        {% for user in user_list %}
            <li>{{ user.name }}</li>
        {% endfor %}
    </ul>

    <nav aria-label="Page navigation">
  <ul class="pagination">
     {{ page_info.pager|safe }}#这里把案例的li删除更换成我们的代码即可
  </ul>
</nav>
</body>

添加上背景色

django中orm分页功能(内置分页)




本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/2064271,如需转载请自行联系原作者

相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
73 1
|
8天前
|
程序员 API 数据库
Django/Flask深度揭秘:揭秘那些让程序员爱不释手的神奇功能!
在Web开发领域,Django与Flask凭借其独特魅力和强大功能深受程序员喜爱。Django作为全能型框架,以其ORM、模板引擎和丰富的内置功能著称;Flask则以轻量级、灵活的路由系统和强大的扩展生态见长。两者各具特色,为开发者提供了高效、灵活的开发工具。
29 4
|
29天前
|
存储 Python
使用django构建一个多级评论功能
使用django构建一个多级评论功能
20 0
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
57 0
|
3月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
125 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
3月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
3月前
|
安全 中间件 项目管理
Django 后端架构开发:分页器到中间件开发
Django 后端架构开发:分页器到中间件开发
41 1
|
3月前
|
数据管理 数据挖掘 调度
Django后端架构开发:URLconf到ORM深度剖析
Django后端架构开发:URLconf到ORM深度剖析
54 1
|
3月前
|
数据库 Python
Django ORM
【8月更文挑战第23天】
42 4
|
4月前
|
存储 NoSQL 中间件
【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录
在当今的数字化时代,用户认证是任何在线服务安全性的基石。本文将简明扼要地介绍登录注册流程中的核心概念:HTTP无状态性、Session、Token与JWT,并详细阐述两种实用登录方式—— 手机号登录验证(借助容联云/云通讯服务) 与钉钉第三方登录。我们将探讨这些概念的基本原理,并深入解析两种登录方式的实现流程,旨在帮助开发者提升用户认证的安全性与便捷性。
【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录