关于Django框架中分页器的使用

最近搬码的时候需要在Django框架中用到分页功能,于是就去百度了一下。

django框架中实现分页功能可以有很多种方式,其中django框架自带了一个分页器库(paginator),相当于一个半成品框架,可以用来帮开发人员快速的实现一个分页功能。

首先分页的大致原理是
1.先从数据库里查询到大量数据集--对应Models.py文件的处理。
2.通过分页器对这些数据进行处理实现分页展示--对应Views.py文件的方法。
3.将数据传到前台进行展示--对应的是Template模板。
(貌似也可以反过来理解,首先前台发起请求,然后通过view.py文件对请求做响应处理,接着在数据库(model.py)中进行数据的查询)

了解了大致原理,我们来进行代码的编写。
[参考文章链接]
(https://blog.csdn.net/qq_41989320/article/details/84308565, https://www.cnblogs.com/harryblog/p/9374206.html)

1.首先是模型文件(Models文件)的处理。在之前的文章中有介绍过链接地址https://www.jianshu.com/p/b9b080439d78),大致就是数据文件的迁移(生成数据库),然后生成大量数据(用来做后续的查询展示处理)。
2.在视图文件(Views文件)中编写分页方法。

from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage, EmptyPage
from .models import User #从models.py文件中引入数据表
def pagination(request):
    user_list = User.objects.all() #查询数据表中的全部元素
    paginator = Paginator(user_list, 8) #对数据进行分页处理,第一个参数是一个列表类型,第二个参数是吗,每页展示数据的条数 

    current_page_num = int(request.GET.get("page", 1)) #获取当前所在页

#这里进行逻辑的判断,进行总页数的显示,判断上下页是否存在等等
   if paginator.num_pages > 11:
        if current_page_num-5 < 1:
            page_range = range(1, 11)
        elif current_page_num+5 > paginator.num_pages:
            page_range = range(paginator.num_pages-11, paginator.num_pages+1)
        else:
            page_range = range(current_page_num-5, current_page_num+6)
    else:
        page_range = paginator.page_range
    try:
        current_page = paginator.page(current_page_num) #创建一个页面的page对象,每一个page对应一个页面
#page对象有三个属性:
#page.number:表示当前查询的页码
#page.object_list:表示当前页要展示的数据
#page.paginator:它是上面创建的paginator = Paginator(user_list, 8)对象,无论那一页,始终跟随着page对象
    except:
        current_page = paginator.page(1) #出现异常默认展示第一页
    return render(request, 'show.html', locals()) #local()函数用来传递参数,作用是返回字典类型的局部变量,可以一次性传递当前函数(pagination)的所有变量

3.模板文件的编写

<div id="d2">
<table>
    <thead>
    <th>序  号</th>
    <th>用户名</th>
    <th>密  码</th>
    <th>身份证</th>
    <th>地  址</th>
    <th>电  话</th>
    <th>预约号</th>
    </thead>
    {% for user in current_page.object_list %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.username }}</td>
        <td>{{ user.password }}</td>
        <td>{{ user.id_number }}</td>
        <td>{{ user.address }}</td>
        <td>{{ user.phone_number }}</td>
        <td>{{ user.reserve_number }}</td>
    </tr>
    {% endfor %}
</table>

<div id="d3">
    {% if current_page.has_previous %}
        <a href="?page={{ current_page_num | add:-1 }}" aria-label="Previous">
            <span aria-hidden="true">&laquo; 上一页</span>
        </a>
    {% else %}
        <a href="" aria-label="Previous">
            <span aria-hidden="true">&laquo; 上一页</span>
        </a>
    {% endif %}
        {% for item in page_range %}
            {% if current_page_num == item %}
                <a href="?page={{ item }}">{{ item }}</a>
            {% else %}
                <a href="?page={{ item }}">{{ item }}</a>
            {% endif %}
        {% endfor %}
    {% if current_page.has_next %}
        <a href="?page={{ current_page_num | add:1 }}" aria-label="Next">
            <span aria-hidden="true">下一页 &raquo;</span>
        </a>
    {% endif %}
</div>

模板文件样式

<style>
 * {
        margin:0;
        padding:0;
    }
    #d2{
       color:white;
       background:#2C778A;
       margin:0 auto;
       margin-top:60px;
       width: 550px;
    }
    #d3{
    color:white;
    width:550px;
    height:30px;
    margin: 0 auto;
    text-align:center;
    }
    #d2 table{
     text-align:center;
     margin:0 auto;
     padding:20px;
    }
    a{
        text-decoration:none;
    }
    a:link{
        color:white;
    }
    a:visited{
        color:white;
    }
</style>

4.本地路由和全局路由的配置

#本地路由文件
from django.urls import path
from . import views
urlpatterns = [
    path('', views.pagination),
]
#全局路由文件
from django.contrib import admin
from django.urls import include, path
from index import views

urlpatterns = [
    path('show/', include("apps.urls")),
    path('admin/', admin.site.urls),
]

好了,到这里全部代码就编写完成了,以上就完成了一个简单的分页展示功能
参考文章链接
1.https://blog.csdn.net/qq_41989320/article/details/84308565
2.https://www.cnblogs.com/harryblog/p/9374206.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • 前言 应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏...
    hehuijun阅读 14,651评论 0 17
  • 《剑》 如果说剑道的最高境界是无剑,那我此时反握在手里的这柄剑,你便看不见。 对于剑,削木为剑,在我很小的时候,就...
    __漠北_阅读 722评论 0 2
  • 马上就要从小白训练营毕业了,说实话之前班班让写毕业感言的时候,我没想过写的,第一我文笔不好,虽然在训练营期间...
    夏洛_edc9阅读 172评论 0 0
  • 广度优先搜索(breadth-first search)处理是否有A到B的路径,如果有最短路径是什么。 思路:建立...
    Adora_cdac阅读 239评论 0 0
  • 你能告诉我应该走哪条路吗?”爱丽丝说。 “这得看你想去哪。”猫说道。 “去哪都无所谓。”爱丽丝说。 “那走哪条路都...
    晶晶201708阅读 150评论 0 0