Django框架(十三)--Django分页组件

一、分页器

数据量大的话,可以分页获取,查看

例如:图书管理中,如果有成千上万本书,要是都在一个页面中渲染出来,会影响页面美观,所以就要用分页器分页渲染

二、分页器的使用

基本写法

基本写法:
    后端:
        总数据拿出来
        生成分页器Paginator对象(对象里有属性和方法)
        生成当前页的对象,current_page=paginator.page(当前页码)
        取出前台传过来的页码,current_page_num = int(request.GET.get(‘page‘))
            -需要有异常捕获
            -捕获到,把当前页码设置成第一页

    前端:
        -for循环总页列表
        -点某一页,跳到指定页码,<li><a href="/index/?page={{ foo }}">{{ foo }}</a></li>

        -上一页,下一页的处理:需要有判断,判断是否有上一页,下一页
        # 判断总页码数是否大于11,不大于11,走else:把总页码数,赋给page_range(前端循环页码列表,循环的就是page_range)
            if paginator.num_pages >11:
                # 当前页码数-5大于1的时候,page_range应该是,page_range就是1到11页?
                if current_page_num-5<1:
                    page_range=range(1,12)
                elif current_page_num+5>paginator.num_pages:
                    # 当前页码数+5大于总页码数,总页码-10,到总页码+1之间
                    page_range=range(paginator.num_pages-10,paginator.num_pages+1)
                else:
                    #其他情况,左5,右6推算,也就是:range(current_page_num - 5, current_page_num + 6)
                    page_range = range(current_page_num - 5, current_page_num + 6)
            else:
                #小于11,有多少页,就显示多少页
                page_range=paginator.page_range
from django.core.paginator import Paginator

# 对象参数
1. Paginator对象:    paginator = Paginator(user_list, 10)
# per_page: 每页显示条目数量

# count:    数据总个数
count = paginator.count

# num_pages:总页数,它是一个对象的方法,通过装饰器伪装成对象属性
page_num = paginator.num_pages

# page_range:总页数的索引范围,如: (1,10),(1,200)
PageRange = paginator.page_range

# page:     page对象,传一个数字,假如你想取到第1页,就传1进去,会返回一个page对象,这个对象里是当前页的一些对象
page_obj = paginator.page(1)

2. page对象:page=paginator.page(1)
# has_next              是否有下一页,它的返回值是一个布尔类型
page.has_next()

# next_page_number      下一页页码,它的返回值是一个int类型
page.next_page_number()

# has_previous          是否有上一页,它的返回值是一个布尔类型
page.has_previous()

# previous_page_number  上一页页码,它的返回值是一个int类型
page.has_previous()

# object_list           分页之后的数据列表
page.object_list()

# number                当前页
page.number()

# paginator             paginator对象

三、案例

1、模板层

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <title>Title</title>
</head>
<body>
<div class="row">
    <div class="col-md-6 col-md-offset-3">

        <table class="table table-striped">
            <thead>
            <tr>
                <th>书名</th>
                <th>价格</th>
            </tr>
            </thead>
            <tbody>
            {% for book in current_page %}
                <tr>
                    <td>{{ book.name }}</td>
                    <td>{{ book.price }}</td>
                </tr>
            {% endfor %}

            </tbody>
        </table>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                {% if current_page.has_previous %}
                    <li>
                        <a href="/index/?page={{ current_page.previous_page_number }}" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% endif %}

                {% for foo in page_range %}
                    {% if current_page_num == foo %}
                        {# 当前页码等于循环到的页码数,变色#}
                        <li class="active"><a href="/index/?page={{ foo }}">{{ foo }}</a></li>
                    {% else %}
                        <li><a href="?page={{ foo }}">{{ foo }}</a></li>
                    {% endif %}
                {% endfor %}

                {% if current_page.has_next %}
                    <li>
                        {#                    <a href="/index/?page={{ current_page_num|add:1 }}" aria-label="Next">#}
                        <a href="/index/?page={{ current_page.next_page_number }}" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% endif %}
            </ul>
        </nav>
    </div>

</div>
</body>
</html>

2、视图层

def index(request):
    book_list = models.Book.objects.all()
    paginator = Paginator(book_list, 3)
    # 如果页码数多,让它显示前5,后5,中间是当前在的页码
    try:

        current_page_num = int(request.GET.get(‘page‘))
        current_page = paginator.page(current_page_num)
        print(current_page.object_list)
        # 总页码数,大于11的时候
        if paginator.num_pages >11:
            # 当前页码数-5大于1的时候,page_range应该是?
            if current_page_num-5<1:
                page_range=range(1,12)
            elif current_page_num+5>paginator.num_pages:
                #     当前页码数+5大于总页码数,总页码数往前推11个
                page_range=range(paginator.num_pages-10,paginator.num_pages+1)
            else:
                page_range = range(current_page_num - 5, current_page_num + 6)
        else:
            #小于11,有多少页,就显示多少页
            page_range=paginator.page_range
    except Exception as e:
        current_page_num = 1
        current_page = paginator.page(current_page_num)

    return render(request, ‘index_next.html‘, locals())

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><title>Title</title></head><body><div class="row"><div class="col-md-6 col-md-offset-3"><table class="table table-striped"><thead><tr><th>书名</th><th>价格</th></tr></thead><tbody>
{% for book in current_page %}
<tr><td>{{ book.name }}</td><td>{{ book.price }}</td></tr>
{% endfor %}

</tbody></table><nav aria-label="Page navigation"><ul class="pagination">
{% if current_page.has_previous %}
<li><a href="/index/?page={{ current_page.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
{% endif %}

{% for foo in page_range %}
{% if current_page_num == foo %}
{# 当前页码等于循环到的页码数,变色#}
<li class="active"><a href="/index/?page={{ foo }}">{{ foo }}</a></li>
{% else %}
<li><a href="?page={{ foo }}">{{ foo }}</a></li>
{% endif %}
{% endfor %}

{% if current_page.has_next %}
<li>
{# <a href="/index/?page={{ current_page_num|add:1 }}" aria-label="Next">#}
<a href="/index/?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% endif %}
</ul></nav></div></div></body></html>

原文地址:https://www.cnblogs.com/zhangbingsheng/p/10663929.html

时间: 2024-10-10 00:21:01

Django框架(十三)--Django分页组件的相关文章

Django的rest_framework的分页组件源码分析

前言: 分页大家应该都很清楚,今天我来给大家做一下Django的rest_framework的分页组件的分析:我的讲解的思路是这样的,分别使用APIview的视图类和基于ModelViewSet的视图类两种方式实现分页的功能,同时我也会介绍两个分页的类,PageNumberPagination类和LimitOffsetPagination,希望能对大家有所帮助! 今天的博客主要的这样的,先讲解基于APIView类的两种分页类的实现方式,然后在讲解基于ModelViewSet类的两种分页类的实现方

Django框架基础之Form组件

服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能:       1 验证(显示错误信息)       2 保留用户上次输入的信息                  -- 可以生成html标签应用: class A_Form(Form): 字段=fields.字段类型(默认参数: required=True, widget=widgets.插件(attrs={})) 常用字段:Charfield,RegexField,I

电子商务系统的设计与实现(十):DWZ框架与第三方分页组件整合

晚上,就是刚刚,在后端管理系统中使用DWZ框架. 先是,直接使用官网网站的Demo,dwz-jui,与编程语言无关的纯静态的那个原始项目. 很快就搭建好了左侧菜单,打开菜单后,出现Tab页面,然后显示目标页面的内容. 然后,就去关注表格分页部分. DWZ自带的分页组件,感觉太麻烦了,一方面分页分成了4个部分显示,主要包括:pagerForm,查询条件pagerHeader,分页表格的头部pagerContent,分页表格的正文panleBar,分页条数栏目. 另一方面,分页html和JS中,需要

Django框架(一)-Django初识

Django初识 一.Web框架本质-自己实现Web框架 1.所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8888)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8192) conn.send(b'OK') conn.close() 2.增加HTT

django框架基础-django redis-长期维护-20191220

###############   django框架-django redis    ############### ###############   django框架-django redis    ############### ###############   django框架-django redis    ############### ###############   django框架-django redis    ############### ##############

django框架基础-django的中间件-长期维护-20200113

##################    中间件      ####################### ##################    中间件      ####################### ##################    中间件      ####################### ##################    中间件      ####################### ##################    中间件     

电子商务系统的设计与实现(十三):分页组件,从前到后,从JS到Java

一.概述   学习实践Web开发5年多了,直到今天,我才算真正实现了最基本最常用的分页组件. 包括:    a.前端JS异步加载并渲染:    b.前端JSP.Freemarker.Struts标签渲染:    c.后端分页       自己写具体的分页算法和逻辑.       使用Mybatis分页插件. 今天,重点介绍下前端JS异步分页,简短介绍下后端Java提供数据.  二. 关键数据结构 public class PageVo { /** 总记录数 */ protected Intege

Django框架基础之分页

Django内置分页: 只适用于只有上一页和下一样的页面 1 def index(request): 2 3 current_page=request.GET.get('page') 4 user_list=models.UserInfo.objects.all() 5 paginator=Paginator(user_list,10) 6 # per_page: 每页显示条目数量 7 # count: 数据总个数 8 # num_pages:总页数 9 # page_range:总页数的索引范

Django【十三】form组件。

一.form组件 form组件的功能: 检验功能 前端生成HTML页面 还能保留输入的内容 form组件的用法: from django import forms # Create your views here. # 定义一个类 class Myform(forms.Form): title = forms.CharField( # 通过from表单进行验证的时候,验证输入title字段的数据,参数用于验证 max_length=20, min_length=2, ) # CharField/

Django框架进阶7 forms组件(pycharm内置测试环境Python Console), cookie与session操作

forms组件 写一个注册页面 获取用户输入的用户名和密码 用户点击注册发送到后端做用户名密码的校验 用户名中不能包含金瓶mei 不符合社会主义核心价值观 密码不能为空 你个DSB,密码怎么能为空 1.手写获取用户输入的前端页面代码 渲染页面 2.后端获取用户数据并做合法性校验 校验数据 3.将校验之后的结果渲染到前端页面 展示信息 不用forms组件代码: app01/views.py from django.shortcuts import render,HttpResponse # Cre