Frontend - 分页(针对 python / Django )

news2025/1/4 6:35:51

目录

一、同个文件内(方式一)

1. 前端 html

2. 定义分页界面

3. 获取分页数据

4.后端根据前端分页需求,整理分页数据

5.显示情况

6. JsonResponse 相关知识

二、不同文件内依旧有效(方式二,更优化)

1. 前端html

2. 定义分页界面(可放在独立的js文件内,可作为公共方法)

3. 获取分页数据(和html同文件)

4. 后端根据前端分页需求,整理分页数据

5. 显示情况


该分页功能是针对Django的Paginator、JsonResponse的回传方式,以及前端Ajax的POST请求。

一、同个文件内(方式一)

1. 前端 html

<div class="table_content table_border H_percent_60">
    <table id="dt_list" class="table table-striped table_view ">
        <thead>
            {% for c in col %} <!-- col是get请求时返回的标题列表-->
            <th>{{ c }}</th>
            {% endfor %}
        </thead>
    </table>
     <!-- 分页 -->
    <div class="dataTables_wrapper"> <!-- 自定义datatable的分页-->
        <div class="row" style="padding-right: 15px;">
            <div class="dataTables_paginate paging_simple_numbers" id="dt_list_paginate">
                <ul id="id_page" class="pagination"></ul>
            </div>
        </div>
    </div>
</div>

2. 定义分页界面

function get_page_html(paginationElement, totalPages, currentPage){
    paginationElement.innerHTML = '';
    // 上一页按钮
    let prevLi = document.createElement('li');  // li标签(排列)
    let prevLink = document.createElement('a'); // a标签(显示文字+绑定点击事件)
    prevLink.textContent = 'Previous'; // 设置显示文字(必须是字符串)
    prevLink.onclick = () => {
        if (currentPage > 1) {
            currentPage--; //只作用于onclick方法中(currentPage在onclick方法外时,没有减1)
        }
        get_query_data(currentPage); // 执行上一页数据的请求
        return false; // 避免a标签#默认跳转
    };
    prevLi.className = 'paginate_button'; // 设置样式(比如和dataTable的显示样式一致)
    prevLi.appendChild(prevLink); // 将a标签插入li标签
    paginationElement.appendChild(prevLi);// 将li标签插入总分页结构
    
    // 首页页码按钮
    let firstPageNumberLi = document.createElement('li');
    let firstPageNumberLink = document.createElement('a');
    firstPageNumberLink.textContent = '1';
    firstPageNumberLink.onclick = () => {
        get_query_data(1); // 执行第一页数据的请求
        return false;
    };
    if (currentPage === 1) { // active 设置当前页的li标签高亮
        firstPageNumberLi.className = 'paginate_button active';
    } else {
        firstPageNumberLi.className = 'paginate_button';
    }
    firstPageNumberLi.appendChild(firstPageNumberLink);
    paginationElement.appendChild(firstPageNumberLi);
    
    // 针对省略号按钮、数字按钮
    let startPage = Math.max(2, currentPage - 3);  // 其中,3是设置当前页码左边的显示个数
    let endPage = Math.min(totalPages-1, currentPage + 3); // 其中,3是设置当前页码右边的显示个数
    
    // 省略号按钮
    if (startPage > 2) {
        let pageNumberLi = document.createElement('li');
        let pageNumberLink = document.createElement('a');
        pageNumberLink.textContent = '...';
        // pageNumberLi.className = 'paginate_button disabled'; // 设置按钮是datatable的button样式、不可操作的样式(不可操作的样式设置好后,下面的onclick事件就需要注释掉)
        pageNumberLink.onclick = () => {
            get_query_data(startPage);// 执行省略号某页数据的请求
            return false;
        };
        pageNumberLi.className = 'paginate_button';
        pageNumberLi.appendChild(pageNumberLink);
        paginationElement.appendChild(pageNumberLi);
    }
    
    // 数字按钮
    for (let i = startPage; i <= endPage; i++) {
        let pageNumberLi = document.createElement('li');
        let pageNumberLink = document.createElement('a');
        pageNumberLink.textContent = i.toString();
        pageNumberLink.onclick = () => {
            get_query_data(i);// 执行某页数据的请求
            return false;
        };
        if (i === currentPage) {
            pageNumberLi.className = 'paginate_button active';// 设置按钮是datatable的button样式、高亮的样式(className样式的名称需同时设置,用空格隔开,而不能分开多次设置,只会最后一次生效)
        } else {
            pageNumberLi.className = 'paginate_button';
        }
        pageNumberLi.appendChild(pageNumberLink);
        paginationElement.appendChild(pageNumberLi);
    }
    
    // 省略号按钮
    if (endPage < totalPages-1) {
        let pageNumberLi = document.createElement('li');
        let pageNumberLink = document.createElement('a');
        pageNumberLink.textContent = '...';
        pageNumberLink.onclick = () => {
            get_query_data(endPage);// 执行省略号某页数据的请求
            return false;
        };
        pageNumberLi.className = 'paginate_button';
        pageNumberLi.appendChild(pageNumberLink);
        paginationElement.appendChild(pageNumberLi);
    }
        
    // 尾页页码按钮
    let totalPageNumberLi = document.createElement('li');
    let totalPageNumberLink = document.createElement('a');
    totalPageNumberLink.textContent = totalPages.toString(); // 设置显示文字(必须是字符串)
    totalPageNumberLink.onclick = () => {
        get_query_data(totalPages); // 执行最后一页数据的请求
        return false;
    };
    if (currentPage === totalPages) { // active 设置当前页的li标签高亮
        totalPageNumberLi.className = 'paginate_button active';
    } else {
        totalPageNumberLi.className = 'paginate_button';
    }
    totalPageNumberLi.appendChild(totalPageNumberLink);
    paginationElement.appendChild(totalPageNumberLi);
    
    // 下一页按钮
    let nextLi = document.createElement('li');
    let nextLink = document.createElement('a');
    nextLink.textContent = 'Next';
    nextLink.onclick = () => {
        if (currentPage < totalPages) {
            currentPage++;//只作用于onclick方法中(currentPage在onclick方法外时,没有递增1)
        }
        get_query_data(currentPage); // 执行下一页数据的请求
        return false;
    };
    nextLi.className = 'paginate_button';
    nextLi.appendChild(nextLink);
    paginationElement.appendChild(nextLi);
}

3. 获取分页数据

var paginationElement = document.getElementById('id_page'); // 分页
$("#id_btn").click(function () {
     get_query_data(1); // 点击查询,默认显示首页数据
});

function get_query_data(currentPage) {
   $.ajax({
        url: window.location.pathname, 
        type: "POST",
        data: {
            "currentPage":currentPage, //当前页码
        },
        beforeSend: function () {
            $("#id_btn").attr({ disabled: true });
        },
        success: function (reply) {
            if (reply.result) {
                let page_data = reply.data['page_data']; //分页功能所需数据
                get_page_html(paginationElement, page_data['all_pages_num'], page_data['current_page_num']) // 执行分页。参数分别为分页组件、分页数据的总页码、当前页码
            }
	             else {
                 paginationElement.innerHTML = ''; // 不显示分页器
            }
        },
        complete: function () {
            $("#id_btn").attr({ disabled: false });
        },
    });
}

4.后端根据前端分页需求,整理分页数据

from django.core.paginator import Paginator #分页所需依赖
class test(View):
    # 只是部分代码    
    def post(self, request):
        try:
            # 获取基本信息
           data = request.POST
		   res_list = [[1,"数据结构","教育",45.00], [1,"数据库原理","教育",34.00]]
                    paginator = Paginator(res_list, 10) # 分页器(10是当前页显示的行数)
           current_page_num = int(data.get('currentPage', 1)) # 当前页码
           page_data = {'all_pages_num': paginator.num_pages, # 总页数
                        'current_page_num': current_page_num, # 当前页码
                        'current_page_data': paginator.page(current_page_num).object_list} # 当前呈现数据
           return JsonResponse(page_data)

 5.显示情况

6. JsonResponse 相关知识

Backend - Django JsonResponse & HttpResponse_django jsonresponse safe-CSDN博客 

二、不同文件内依旧有效(方式二,更优化)

1. 前端html

<div class="table_content table_border H_percent_60">
    <table id="dt_list" class="table table-striped table_view ">
        <thead>
            {% for c in col %} <!-- col是get请求时返回的标题列表-->
            <th>{{ c }}</th>
            {% endfor %}
        </thead>
    </table>
    <!-- 分页 -->
    <div class="dataTables_wrapper"> <!-- 自定义datatable的分页-->
        <div class="row" style="padding-right: 15px;">
            <div class="dataTables_paginate paging_simple_numbers" id="dt_list_paginate">
                <ul id="id_page" class="pagination"></ul>
            </div>
        </div>
    </div>
</div>

2. 定义分页界面(可放在独立的js文件内,可作为公共方法)

/**
 * dataTable 分页(给页码标签增添点击事件、设置样式)
 * @pagination_ele 页码功能的位置 
 * @show_txt li标签显示的文字
 * @style_name li标签的样式
 * @is_click 是否添加点击事件 
 * @current_page 点击事件中跳转的页码值
 * @get_query_data 执行的方法
 * @return pagination_ele
 */
function set_dt_pagination(pagination_ele, show_txt, style_name, is_click=false, current_page=1, get_query_data=null){
    let eleLi = document.createElement('li');
    let eleLink = document.createElement('a');
    eleLink.textContent = show_txt;
    if(is_click){
        eleLink.onclick = () => {
            get_query_data(current_page); // get_query_data并没有立马被调用,而是定义在onclick中,只有用户点击时才真正的被触发。
            return false;
        };
    }
    eleLi.className = style_name;
    eleLi.appendChild(eleLink);
    pagination_ele.appendChild(eleLi);
    return pagination_ele;
}

/**
 * dataTable 分页(设置页码标签位置、判断当前页码)
 * @paginationElement 需要渲染的分页组件
 * @totalPages 总页数 
 * @currentPage 当前页码
 * @get_query_data 执行的方法
 */
function get_page_html(paginationElement, totalPages, currentPage, get_query_data){
    paginationElement.innerHTML = '';
    // 上一页按钮
    let prePage = currentPage;
    if (currentPage > 1) {
        prePage = currentPage-1;
    }
    paginationElement = set_dt_pagination(paginationElement, 'Previous', 'paginate_button', true, prePage, get_query_data); // get_query_data不能加括号,只是传递方法
    
    // 首页页码按钮            
    if (currentPage === 1) { // active 设置当前页的li标签高亮
        style_name = 'paginate_button active';
    } else {
        style_name = 'paginate_button';
    }
    paginationElement = set_dt_pagination(paginationElement, '1', style_name, true, 1, get_query_data); // get_query_data不能加括号,只是传递方法
    // 针对省略号按钮、数字按钮
    let startPage = Math.max(2, currentPage - 1);
    let endPage = Math.min(totalPages-1, currentPage + 1);
    // 左边的省略号按钮(可点击)
       if (startPage > 2) {
        // paginationElement = set_dt_pagination(paginationElement, '...', 'paginate_button disabled'); // 设置按钮是datatable的button样式、不可点击的样式
        paginationElement = set_dt_pagination(paginationElement, '...', 'paginate_button', true, startPage, get_query_data);
    }
    // 数字按钮
    for (let i = startPage; i <= endPage; i++) {              
        if (currentPage === i) { // active 设置当前页的li标签高亮
            style_name = 'paginate_button active';
        } else {
            style_name = 'paginate_button';
        }
        paginationElement = set_dt_pagination(paginationElement, i.toString(), style_name, true, i, get_query_data); // get_query_data不能加括号,只是传递方法
    }
    // 右边的省略号按钮(可点击)
    if (endPage < totalPages-1) {
        // paginationElement = set_dt_pagination(paginationElement, '...', 'paginate_button disabled'); // 设置按钮是datatable的button样式、不可点击的样式
        paginationElement = set_dt_pagination(paginationElement, '...', 'paginate_button', true, endPage, get_query_data);
    }
    
    // 尾页页码按钮           
    if (currentPage === totalPages) { // active 设置当前页的li标签高亮
        style_name = 'paginate_button active';
    } else {
        style_name = 'paginate_button';
    }
    paginationElement = set_dt_pagination(paginationElement, totalPages.toString(), style_name, true, totalPages, get_query_data); // get_query_data不能加括号,只是传递方法
    // 下一页按钮
    let nextPage = currentPage;
    if (currentPage < totalPages) {
        nextPage = currentPage+1;
    }
    paginationElement = set_dt_pagination(paginationElement, 'Next', 'paginate_button', true, nextPage, get_query_data); // get_query_data不能加括号,只是传递方法
}

3. 获取分页数据(和html同文件)

var paginationElement = document.getElementById('id_page'); // 分页。对应模板的id_page的组件
$("#id_btn").click(function () {
     get_query_data(1); // 点击查询,默认显示首页数据
});
function get_query_data(currentPage) {
   $.ajax({
        url: window.location.pathname, 
        type: "POST",
        data: {
            "currentPage":currentPage, //当前页码
        },
        beforeSend: function () {
            $("#id_btn").attr({ disabled: true });
        },
        success: function (reply) {
            if (reply.result) {
                let page_data = reply.data['page_data']; //分页功能所需数据
                get_page_html(paginationElement, page_data['all_pages_num'], page_data['current_page_num'], get_query_data) // 执行分页。参数分别为分页组件、分页数据的总页码、当前页码、分页方法(第四个参数get_query_data保证在不同js代码文件中也能执行。看似运用了递归,但其实在get_page_html中并没有立马调用它,而是onclick规定只有用户点击时才真正的被触发)
            } else {
                 paginationElement.innerHTML = ''; // 不显示分页器
             }
        },
        complete: function () {
            $("#id_btn").attr({ disabled: false });
        },
    });
}

4. 后端根据前端分页需求,整理分页数据

from django.core.paginator import Paginator #分页所需依赖
class test(View):
    # 只是部分代码    
    def post(self, request):
        try:
            # 获取基本信息
           data = request.POST
		   res_list = [[1,"数据结构","教育",45.00], [1,"数据库原理","教育",34.00]]
                    paginator = Paginator(res_list, 10) # 分页器(10是当前页显示的行数)
           current_page_num = int(data.get('currentPage', 1)) # 当前页码
           page_data = {'all_pages_num': paginator.num_pages, # 总页数
                        'current_page_num': current_page_num, # 当前页码
                        'current_page_data': paginator.page(current_page_num).object_list} # 当前呈现数据
return JsonResponse(page_data)

5. 显示情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;

按照乘法分解10点结构

在行列可自由变换的平面上9点结构有1430个&#xff0c;10点结构有3908个。其中可被分解为2*5的有102个&#xff0c; 5a1*2a110a28 5a1*2a210a689 5a1*2a310a1722 5a2*2a110a172 5a2*2a210a1081 5a2*2a310a2006 5a3*2a110a275 5a3*2a210a1561 5a3*2a310a2381 5a4*2a110…

JVM实战—6.频繁YGC和频繁FGC的后果

大纲 1.JVM GC导致系统突然卡死无法访问 2.什么是Young GC什么是Full GC 3.Young GC、Old GC和Full GC的发生情况 4.频繁YGC的案例(G1解决大内存YGC过慢) 5.频繁FGC的案例(YGC存活对象S区放不下) 6.问题汇总 1.JVM GC导致系统突然卡死无法访问 (1)基于JVM运行的系统最怕…

word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法

目录 问题描述解决方案 问题描述 解决方案 打开C盘找到路径C:\Users\Administrator\AppData\Roaming\Microsoft\Word\STARTUP或者在everything中搜索“Microsoft\Word\STARTUP”删除NEWebWordAddin.dotm文件即可正确打开word。

微服务保护—Sentinel快速入门+微服务整合 示例: 黑马商城

1.微服务保护 微服务保护是确保微服务架构可靠、稳定和安全的策略与技术。 在可靠性上&#xff0c;限流是控制进入微服务的请求数量&#xff0c;防止流量过大导致服务崩溃。比如电商促销时对商品详情服务进行流量限制。熔断是当被调用的微服务故障过多或响应过慢时&#xff0c;…

屏幕时序参数详解

屏幕时序参数详解 作者&#xff1a;&#xff08;Witheart&#xff09;更新时间&#xff1a;20241231 本文详细介绍了屏幕显示时序的基本参数&#xff0c;包括水平和垂直方向的有效像素、同步信号、前肩、后肩及其总周期的定义与计算公式。同时&#xff0c;通过公式和图示&…

2024年RAG:回顾与展望

2024年&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术经历了从狂热到理性的蜕变&#xff0c;成为大模型应用领域不可忽视的关键力量。年初&#xff0c;AI的“无所不能”让市场充满乐观情绪&#xff0c;RAG被视为解决复杂问题的万能钥匙&#xff1…

webpack01

webpack是一个前端工程化的打包工具 webpack在打包的时候&#xff0c;会形成一个依赖关系图&#xff0c;关联要打包的模块&#xff0c;&#xff0c;&#xff0c;不同的模块通过不同的loader去解析&#xff0c;&#xff0c;&#xff0c;比如解析css使用 css-loader,解析js使用b…

牛客网最新1129道 Java 面试题及答案整理

前言 面试&#xff0c;跳槽&#xff0c;每天都在发生&#xff0c;而对程序员来说"金三银四"更是面试和跳槽的高峰期&#xff0c;跳槽&#xff0c;更是很常见的&#xff0c;对于每个人来说&#xff0c;跳槽的意义也各不相同&#xff0c;可能是一个人更向往一个更大的…

python版本的Selenium的下载及chrome环境搭建和简单使用

针对Python版本的Selenium下载及Chrome环境搭建和使用&#xff0c;以下将详细阐述具体步骤&#xff1a; 一、Python版本的Selenium下载 安装Python环境&#xff1a; 确保系统上已经安装了Python 3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python&#xff0c;…

突破管理困局,驾驭变革浪潮

在瞬息万变的商业环境中&#xff0c;变革已成为企业生存和发展的必经之路。许多企业在面对激烈竞争、技术进步和市场变化时&#xff0c;都会选择或被迫进行各种形式的变革。本文将深入探讨变革管理的重要性&#xff0c;介绍常见的变革模型&#xff0c;并提供实用的策略和建议&a…

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…

【论文阅读笔记】SCI算法与代码 | 低照度图像增强 | 2022.4.21

目录 一 SCI 1 SCI网络结构 核心代码&#xff08;model.py&#xff09; 2 SCI损失函数 核心代码&#xff08;loss.py&#xff09; 3 实验 二 SCI效果 1 下载代码 2 运行 一 SCI &#x1f49c;论文题目&#xff1a;Toward Fast, Flexible, and Robust Low-Light Image …

wps透视数据表

1、操作 首先选中你要的行字段表格 -> 插入 -> 透视数据表 -> 拖动行值&#xff08;部门&#xff09;到下方&#xff0c;拖动值&#xff08;包裹数量、运费&#xff09;到下方 2、删除 选中整个透视数据表 -> delete 如图&#xff1a;

STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计

SMEC88ST SDK开发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的&#xff0c;主要是因为方案主芯片不具备防破解的功能&#xff0c;这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制&#xff0c;到市场上的只能以价格竞争&#xff0c;最后工厂复制的产…

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式&#xff1a; 称为正弦电流的三要素。 分别为振幅/幅值&#xff0c;角频率&#xff0c;初相。 幅值为正弦电流的最大值&#xff0c;恒为正。 为正弦电…

多模态论文笔记——Coca(副)

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型Coca&#xff0c;在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa​论文模型结构CoCa…

【Python系列】处理空请求体Body

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【毕业设计选题】目标检测方向毕业设计选题推荐 2025

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…