Frontend - 分页(针对 python / Django )

目录

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

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);}// 尾页页码按钮if(totalPages != 1){ // 保证只有1页时,不会重复出现两次第1页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.POSTres_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(totalPages != 1){ // 保证只有1页时,不会重复两次第一页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.POSTres_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.mzph.cn/news/891638.shtml

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

相关文章

【快速实践】深度学习 -- 数据曲线平滑化

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; 在观察数据结果时&#xff0c;我们通常希望获得整体趋…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

JavaScript 基础2

js的运算符 算数运算符 相加求和&#xff0c;如果用在字符串则是拼接 -相减求差 *相乘求积 /相除求商 %模除求余 具体用法如下 let num 154 let num2 15 document.write(numnum2) document.write(<br>) document.write(num-num2) document.write(<br>) do…

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开&#xff0c;本次讲座中来自Xsens的人形机器人与动捕技术专家Jeffrey Muller与Dennis Kloppenburg不仅将就Xsens动作捕捉系统与人形机器人行为训练中的实际应用进行详细讲解&#xff0c;同时还会对目前大家所关注…

ArcGIS Server 10.2授权文件过期处理

新的一年&#xff0c;arcgis server授权过期了&#xff0c;服务发不不了。查看ecp授权文件&#xff0c;原来的授权日期就到2024.12.31日。好吧&#xff0c;这里直接给出处理方法。 ArcGIS 10.2安装时&#xff0c;有的破解文件中会有含一个这样的注册程序&#xff0c;没有的话&…

Fabric部署-docker安装

一&#xff1a;安装docker 1.先卸载旧docker apt-get remove docker docker-engine docker.io containerd runc PS&#xff1a;新开的虚拟机输入命令后是这样的。 2.更新软件包 在终端中执行以下命令来更新Ubuntu软件包列表和已安装软件的版本: sudo apt update sudo apt …

Scrum中敏捷项目经理(Scrum Master)扮演什么角色?

敏捷开发模式已经逐渐被主流的软件研发团队所接受&#xff0c;其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色&#xff1a;Product Owner&#xff08;PO&#xff09;、Scrum Master&#xff08;SM&#xff09;和Development Team&#xff08;DT&#xff09;。…

计算机毕设-基于springboot的教务管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

ROS导航使用贝塞尔曲线对全局路径进行平滑处理

文章目录 前言一、贝塞尔曲线的使用二、全局路经修改三、结果对比 前言 ROS原生的全局路径规划GlobalPlanner包含A*和Dijkstra&#xff0c;两者原理基本相同&#xff0c;能够规划出从起点到终点的路径&#xff0c;但是由于栅格地图存在锯齿形&#xff0c;得到的全局路径也会出…

GIT 企业级开发学习 1

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls -a 显示隐藏文件…

【从零开始入门unity游戏开发之——unity篇05】unity6基础入门——运行游戏按钮、Game游戏窗口和Project项目窗口介绍

文章目录 运行游戏按钮、Game游戏窗口和Project项目窗口一、运行游戏按钮二、Game游戏窗口1、右上角设置1.1 如果没有相机渲染则发出警告1.2 在”编程模式”下清除每一帧1.3 窗口最大化 2、上方工具&#xff08;1&#xff09;切换手机模拟器&#xff08;2&#xff09;切换不同显…

Java 定时任务发送邮件

163邮箱为例 1、添加依赖 <!-- mail-starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency> 2、编写配置&#xff0c;smtp默认端口25&#xff0c…

【深度学习进阶】基于CNN的10种物体识别项目

介绍 基于卷积神经网络&#xff08;CNN&#xff09;的猫狗图片分类项目是机器学习领域中的一种常见任务&#xff0c;它涉及图像处理和深度学习技术。以下是该项目的技术点和流程介绍&#xff1a; 技术点 卷积神经网络 (CNN): CNN 是一种专门用于处理具有类似网格结构的数据的…

开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频

‌Groovy‌是一种基于Java虚拟机&#xff08;JVM&#xff09;的敏捷开发语言&#xff0c;结合了Python、Ruby和Smalltalk的许多强大特性。它旨在提高开发者的生产力&#xff0c;通过简洁、熟悉且易于学习的语法&#xff0c;Groovy能够与Java代码无缝集成&#xff0c;并提供强大…

Flutter中添加全局防护水印的实现

随着版权意识的加强&#xff0c;越来越多的应用开始在应用内部增加各种各样的水印信息&#xff0c;防止核心信息泄露&#xff0c;便于朔源。 效果如下&#xff1a; 在Flutter中增加全局水印的方式&#xff0c;目前有两种实现。 方案一&#xff0c;在native层添加一个遮罩层&a…

华为ensp-BGP路由过滤

学习新思想&#xff0c;争做新青年&#xff0c;今天学习的是BGP路由过滤 实验目的&#xff1a; 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容&#xff1a; 本实…

鸿蒙应用开发搬砖经验之—使用DevTools工具调试前端页面

环境说明&#xff1a; 系统环境&#xff1a;Mac mini M2 14.5 (23F79) 开发IDE&#xff1a;DevEco Studio 5.0.1 Release 配置步骤&#xff1a; 按着官方的指引来慢慢一步一步来&#xff0c;但前提是要配置好SDK的路径&#xff08;没有配置的话&#xff0c;可能先看下面的配…

Linux(centos)安装 MySQL 8 数据库(图文详细教程)

前言 前几天写了个window系统下安装Mysql的博客&#xff0c;收到很多小伙伴私信需要Linux下安装Mysql的教程&#xff0c;今天这边和大家分享一下&#xff0c;话不多说&#xff0c;看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹&#xff…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

查看打开的端口

对一个大范围的网络或活跃的主机进行渗透测试&#xff0c;需要了解这些主机上所打开的端口号。 使用Nmap工具扫描主机上开放的端口号&#xff1a; 输出的信息显示了主机www.yiai.xyz上开放的所有端口 指定扫描端口范围 如果目标主机上打开的端口较多时&#xff0c;用户查看起…