Django和jQuery,实现Ajax表格数据分页展示
1.需求描述
当存在重新请求接口才能返回数据的功能时,若页面的内容很长,每次点击一个功能,页面又回到了顶部,对于用户的体验感不太友好,我们希望当用户点击这类的功能时,能直接加载到数据,请求后端的操作不会呈现在前端,给用户一种无感知的状态。
若希望在不重新加载页面的情况下,动态的获取某个功能点的数据,需要用到Ajax技术,当点击某个功能的按钮时,触发Ajax请求,由Ajax与后端(Django)进行交互,传递一些参数得到新数据后,最后渲染在前端页面。
需要考虑一个问题:在前端上的分页按钮是有样式的,且样式是根据后端返回的参数进行判断,最终决定给哪一个分页按钮增加样式,为了避免分页数据可以正常获取,但是分页样式不会改变,基于这个问题进行思考,最后的解决方法是:将分页部分的代码也通过Ajax进行渲染。
2.将表格数据和分页功能的前端代码进行拆分
1)order_data_tables.html
代码文件存放表格数据。
<table class="table-content table table-bordered table-hover"><thead class="thead-dark"><tr><th>品牌</th><th>商品名称</th><th>商品编号</th><th>订单编号</th><th>颜色</th><th>进价</th><th>零售价</th><th>净赚利润</th><th>数量</th></tr></thead><tbody style="font-size: 14px;">{% for data in order_page_data %}<tr><td>{{ data.brand }}</td><td>{{ data.commodity_name }}</td><td>{{ data.commodity_number }}</td><td>{{ data.order_number }}</td><td>{{ data.commodity_color }}</td><td>{{ data.purchasing_price }}</td><td>{{ data.retail_price }}</td><td>{{ data.profit }}</td><td>{{ data.quantity }}</td></tr>{% endfor %}</tbody>
</table>
2)order_data_page.html
代码文件存放分页功能。
<ul class="pagination justify-content-center">{% if order_page_data.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ order_page_data.previous_page_number }}" data-page={{ order_page_data.previous_page_number }}>上一页</a></li>{% else %}<li class="page-item disabled "><a class="page-link">上一页</a></li>{% endif %}{% for page in order_page_data.paginator.page_range %}<li class="page-item {% if page == order_page_data.number %}active{% endif %}"><a class="page-link" href="#" data-page="{{ page }}">{{ page }}</a></li>{% endfor %}{% if order_page_data.has_next %}<li class="page-item"><a class="page-link" href="?page={{ order_page_data.next_page_number }}" data-page={{ order_page_data.next_page_number }}>下一页</a></li>{% else %}<li class="page-item disabled"><a class="page-link">下一页</a></li>{% endif %}
</ul>
3)order_data_page.html
总页面前端代码文件中依然保留表格和分页的代码。
3.后端处理分页功能以及Ajax方式的请求
分页实现起来很简单,主要是处理Ajax的请求,当请求为Ajax时,通过render_to_string()
方法将order_data_tables.html
(表格数据的前端文件)和order_data_page.htm
(分页的前端文件)与后端传递的分页参数进行渲染,并将渲染好的HTML以字符串的形式返回,并存储到变量中,到这一步时,此次访问的某一页对应的表格数据和分页样式已经全部渲染完毕。
然后通过JsonResponse()
方法将存储表格和分页数据的变量,以JSON格式返回给前端。
from django.http import HttpResponse, JsonResponse
from django.template.loader import render_to_stringdef order_manage_beautiful(request):order_data = OrderManage.objects.order_by('-id')······# 分页order_pages = Paginator(order_data, 10)order_page_num = int(request.GET.get("page", 1))if order_page_num > order_pages.count:order_page_num = 1order_page_data = order_pages.page(order_page_num)# 判断是否是Ajax请求,若为Ajax请求,则将表格数据和分页的前端代码进行渲染,并以Jason格式返回给前端if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':# render_to_string方法会将前端代码与后端参数渲染后,返回成html文本order_table_html = render_to_string("order_data_tables.html", {"order_page_data": order_page_data})order_page_html = render_to_string("order_data_page.html", {"order_page_data": order_page_data})return JsonResponse({"order_table_html": order_table_html, "order_page_html": order_page_html})return render(request, "order_manage_beautiful.html", {"is_file": is_file, "order_data": order_data, "order_page_data": order_page_data})
返回的Json如下所示。
4.编写Ajax请求分页数据的代码
4.1.为表格部分的代码绑定ID属性
为表格的上层div标签绑定一个ID属性:id="order_table"
,Ajax拿到新数据后要渲染在这个标签里,完成表格数据的动态更新。
<div class="card-body" id="order_table"><table class="table-content table table-bordered table-hover"><thead class="thead-dark"><tr><th>品牌</th><th>商品名称</th><th>商品编号</th><th>订单编号</th><th>颜色</th><th>进价</th><th>零售价</th><th>净赚利润</th><th>数量</th></tr></thead><tbody style="font-size: 14px;">{% for data in order_page_data %}<tr><td>{{ data.brand }}</td><td>{{ data.commodity_name }}</td><td>{{ data.commodity_number }}</td><td>{{ data.order_number }}</td><td>{{ data.commodity_color }}</td><td>{{ data.purchasing_price }}</td><td>{{ data.retail_price }}</td><td>{{ data.profit }}</td><td>{{ data.quantity }}</td></tr>{% endfor %}</tbody></table>
</div>
4.2.为分页功能的代码绑定ID属性
依旧是分页功能的上层div标签中绑定:id="order_page"
。
<div aria-label="Page navigation example" style="margin-top: 20px;" id="order_page"><ul class="pagination justify-content-center">{% if order_page_data.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ order_page_data.previous_page_number }}" data-page={{ order_page_data.previous_page_number }}>上一页</a></li>{% else %}<li class="page-item disabled "><a class="page-link">上一页</a></li>{% endif %}{% for page in order_page_data.paginator.page_range %}<li class="page-item {% if page == order_page_data.number %}active{% endif %}"><a class="page-link" href="#" data-page="{{ page }}">{{ page }}</a></li>{% endfor %}{% if order_page_data.has_next %}<li class="page-item"><a class="page-link" href="?page={{ order_page_data.next_page_number }}" data-page={{ order_page_data.next_page_number }}>下一页</a></li>{% else %}<li class="page-item disabled"><a class="page-link">下一页</a></li>{% endif %}</ul>
</div>
4.3.编写Ajax实现分页数据的动态更新
当点击class为page-link
的标签时(点击了分页框),触发Ajax请求,请求/order_manage_beautiful
接口,并传递page
参数,访问成功后会返回一个JSON格式的数据,将JSON中的data.order_table_html
Key的数据渲染到表格的div中,将JSON中的data.order_page_html
Key的数据渲染到分页的div中。
$(document).on('click', '.page-link', function(e) {e.preventDefault();var page = $(this).data('page')$.ajax({url: '/order_manage_beautiful',type: "GET",data: {page: page},success: function(data) {// 渲染表格数据$('#order_table').html(data.order_table_html);// 渲染分页功能$('#order_page').html(data.order_page_html);}});
});
4.4.效果展示
相关文章:

Django和jQuery,实现Ajax表格数据分页展示
1.需求描述 当存在重新请求接口才能返回数据的功能时,若页面的内容很长,每次点击一个功能,页面又回到了顶部,对于用户的体验感不太友好,我们希望当用户点击这类的功能时,能直接加载到数据,请求…...

k8s认证
1. 证书介绍 服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥 一共有多少证书: *Etcd: Etcd对外提供服务,要有一套etcd server证书Etcd各节点之间进行通信,要有一套etcd peer证书Kube-APIserver访问Etcd&a…...

基于python开发的IP修改工具
工作中调试设备需要经常修改电脑IP,非常麻烦,这里使用Pythontkinter做了一个IP修改工具 说明: 1.启动程序读取config.json文件2.如果没有该文件则创建,写入当前网卡信息3.通过配置信息进行网卡状态修改4.更新文件状态,删除或修…...

Mybatis源码分析
1. Mybatis整体三层设计 SSM中,Spring、SpringMVC已经在前面文章源码分析总结过了,Mybatis源码相对Spring和SpringMVC而言是的简单的,只有一个项目,项目下分了很多包。从宏观上了解Mybatis的整体框架分为三层,分别是基…...

python树结构包treelib入门及其计算应用
树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括: 节点搜索的高效操作。支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制…...

Rust之自动化测试(三): 测试组合
开发环境 Windows 10Rust 1.73.0 VS Code 1.83.1 项目工程 这里继续沿用上次工程rust-demo 测试组合 正如本章开始时提到的,测试是一个复杂的学科,不同的人使用不同的术语和组织。Rust社区根据两个主要类别来考虑测试:单元测试和集成测试。单元测试很…...

专业管理菜单的增删改、查重
1,点击专业管理菜单------查询所有专业信息列表 ①点击菜单,切换专业组件 ②切换到列表组件后,向后端发送请求到Servlet ③调用DAO层,查询数据库(sql),封装查询到的内容 ④从后端向前端做出…...

vue3插件开发,上传npm
创建插件 在vue3工程下,创建组件vue页: toolset.vue。并设置组件名称。注册全局组件。新建index.js文件。内容如下,可在main.js中引入index.js,注册该组件进行测试。
python【多线程、单线程、异步编程】三个版本--在爬虫中的应用
并发编程在爬虫中的应用 之前的课程,我们已经为大家介绍了 Python 中的多线程、多进程和异步编程,通过这三种手段,我们可以实现并发或并行编程,这一方面可以加速代码的执行,另一方面也可以带来更好的用户体验。爬虫程…...

大模型LLM相关面试题整理-位置编码-tokenizer-激活函数-layernorm
10 LLMs 位置编码篇 10.1.1 什么是位置编码? 位置编码是一种用于在序列数据中为每个位置添加位置信息的技术。在自然语言处理中,位置编码通常用于处理文本序列。由于传统的神经网络无法直接捕捉输入序列中的位置信息,位置编码的引入可以帮助…...
python在nacos注册微服务
安装 首先需要安装python的nacos sdk pip install nacos-sdk-python 注册 注册过程非常简单,需要注意的是,注册完要定时发送心跳,否则服务会被nacos删掉。 import nacos import timeSERVER_ADDRESSES "http://1.2.3.4:8848" …...

tuxera ntfs2024破解版mac电脑磁盘读写软件
大家都知道由于操作系统的原因,在苹果电脑上不能够读写NTFS磁盘,但是,今天小编带来的这款tuxera ntfs 2024 mac版,完美的解决了这个问题。这是一款在macOS平台上使用的磁盘读写软件,能够实现苹果Mac OS X系统读写Micro…...

【源码】C++坦克大战源码
文章目录 题目介绍你收到的所有文件源码效果展示报告内容 题目介绍 代码量:1450 语言:C 你收到的所有文件 其中一个是devc版本,也可以用visual stdio 运行。 源码效果展示 typedef struct //这里的出现次序指的是一个AI_ta…...

AIO开放接口平台免费畅享ChatGPT聊天、联网互动、学术等服务!更有DALL·E 3最强AI绘图功能!
免费畅享! AIO平台ChatGPT联网、聊天、学术等服务! AIO开放接口平台 | 服务介绍 ALL IN ONE (AIO)API服务是LLM(大语言模型)开放接口平台:持续接入各种主流的大模型接口,并提供简单、易用、统一的API交互…...
【python】屈小原现在要为学校写校庆贺文(CTGU百年校庆)
题目: """ 题目描述: 屈小原需要为学校的校庆写一篇贺文,共需写下n个字,但他目前只完成了1个字。屈小原可以进行两种操作: 在文档的末尾添加一个字,这样字数就会变为x1。 写下与当前字数相同…...

探索未来的视觉革命:卷积神经网络的崭新时代(二)
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

博客后台模块续更(三)
四、后台模块-动态路由 实现了这个动态路由功能之后,就能在浏览器web页面登录进博客管理后台了 1. 接口分析 后台系统需要能实现不同的用户权限可以看到不同的功能,即左侧的导航栏 请求方式 请求地址 请求头 GET /getRouters 需要token请求头 …...
第十二届蓝桥杯模拟赛第三期
A填空题 问题描述 请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。 参考答案 800 public class Main {public static void main(String[] args) {int ans0;for(int i1;i<2020;i) {if(gcd(2020,i)1) {ans;}}…...

2023年浙大MEM考前80天上岸经验分享
时间过得真快,转眼间已经是十月份了。回想起去年这个时候,我还在为考研而感到焦虑不安。然而,如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中,我不仅学到了许多专业知识,还结识了很多志同道合…...

增加并行度后,发现Flink窗口不会计算的问题。
文章目录 前言一、现象二、结论三、解决 前言 窗口没有关闭计算的问题,一直困扰了很久,经过多次验证,确定了问题的根源。 一、现象 Flink使用了window,同时使用了watermark ,并且还设置了较高的并行度。生产是设置了…...
rk3588 区分两个相同的usb相机
有时候会插入两个一模一样的usb相机,担心每次启动他们所对应的设备节点 /dev/video* 会变化,所以需要绑定usb口,区分两个相机。把两个相机都插入后,查看usb信息 rootrk3588:/# udevadm info --attribute-walk --name/dev/video0U…...
【EasyExcel】导出时添加页眉页脚
一、需求 使用 EasyExcel 导出时添加页眉页脚 二、添加页眉页脚的方法 通过配置WriteSheet或WriteTable对象来添加页眉和页脚。以下是具体实现步骤: 1. 创建自定义页眉页脚实现类 public class CustomFooterHandler implements SheetWriteHandler {private final…...

AWS App Mesh实战:构建可观测、安全的微服务通信解决方案
摘要:本文详解如何利用AWS App Mesh统一管理微服务间通信,实现精细化流量控制、端到端可观测性与安全通信,提升云原生应用稳定性。 一、什么是AWS App Mesh? AWS App Mesh 是一种服务网格(Service Mesh)解…...

智能对联网页小程序的仓颉之旅
#传统楹联遇上AI智能体:我的Cangjie Magic开发纪实 引言:一场跨越千年的数字对话 "云对雨,雪对风,晚照对晴空"。昨天晚上星空璀璨,当我用仓颉语言写下第一个智能对联网页小程序的Agent DSL代码时࿰…...

【数据结构】6. 时间与空间复杂度
文章目录 一、算法效率1、算法的复杂度 二、时间复杂度1、时间复杂度的概念2、大O的渐进表示法3、常见时间复杂度计算1)实例12)实例23)实例34)实例45)实例56)实例67)实例78)实例8 三…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1开通指南及使用心得
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站排名top 28。 🏆数年电商行业从业经验,AWS/阿里云资深使用用…...

基于JWT+SpringSecurity整合一个单点认证授权机制
基于 JWT Spring Security 的授权认证机制,在整体架构设计上体现了高度的安全性与灵活性。其在整合框架中的应用,充分展示了模块化、可扩展性和高效鉴权的设计理念,为开发者提供了一种值得借鉴的安全架构模式。 1.SpringSecurity概念理解 …...
Android 蓝牙通信
Android 平台提供了完整的蓝牙 API,支持 传统蓝牙(Bluetooth Classic)和低功耗蓝牙(BBluetooth Low Energy, BLE)两种通信方式。 以下是开发蓝牙应用的关键知识点。 1. 基本概念 传统蓝牙(Bluetooth Classic) 适合大流量数据传输(如音频、文件传输) 典型协议: R…...

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址
本文介绍了基于W5500芯片的ARP协议实现方法,详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射,确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现,包括网络初始化、SP…...
html表格转换为markdown
文章目录 工具功能亮点1.核心实现解析1. 剪贴板交互2. HTML检测与提取3. 转换规则设计 2. 完整代码 在日常工作中,我们经常遇到需要将网页表格快速转换为Markdown格式的场景。无论是文档编写、知识整理还是数据迁移,手动转换既耗时又容易出错。本文将介绍…...