Django学习第六天
启动项目命令
python manage.py runserver
取消模态框功能

js实现列表数据删除

第二种实现思路

使用jquery修改模态框标题

编辑页面拿到数据库数据显示默认数据功能实现

想要去数据库中获取数据时:对象/字典


三种不同的数据类型

使用Ajax传入数据实现表单编辑,删除,修改功能
order1.py
import json
import randomfrom django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from django.views.decorators.csrf import csrf_exempt
from datetime import datetime
from app01.utils.pagination import Paginationclass OrderModelForm(BootStrapModelForm):class Meta:model = models.Order# field = "__all__"# fields = [""]exclude = ["oid", "admin"]def order_list(request):queryset = models.Order.objects.all().order_by('-id')page_object = Pagination(request, queryset)form = OrderModelForm()context = {'form': form,'queryset': page_object.page_queryset,'page_string': page_object.html()}return render(request, 'order_list.html', context)@csrf_exempt
def order_add(request):""" 新建订单 (Ajax请求)"""form = OrderModelForm(data=request.POST)if form.is_valid():# 额外增加一些不是用户输入的值(自己计算值)form.instance.oid = datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1000, 9999))# 固定设置管理员ID# form.instance.admin = 当前登录系统管理员的ID# keys = list(request.session.keys())# print(keys)form.instance.admin_id = request.session["info"]["id"]# 保存到数据库中form.save()return JsonResponse({"status": True})# return HttpResponse(json.dumps({"status": True}))return JsonResponse({"status": False, 'error': form.errors})def order_delete(request):""" 删除订单 """uid = request.GET.get("uid")exists = models.Order.objects.filter(id=uid).exists()if not exists:return JsonResponse({"status": True, 'error': "删除失败,数据不存在"})models.Order.objects.filter(id=uid).delete()return JsonResponse({"status": True})def order_detail(request):""" 根据ID获取订单明细 """# 方式1# uid = request.GET.get("uid")# row_object = models.Order.objects.filter(id=uid).first()# if not row_object:# return JsonResponse({"status": False, 'error': "数据不存在,"})## # 从数据库中获取到一个对象 row_object# result = {# "status": True,# "data": {# "title": row_object.title,# "price": row_object.price,# "status": row_object.status,# }# }# return JsonResponse({"status": True, "data": result})# 方式2uid = request.GET.get("uid")row_dict = models.Order.objects.filter(id=uid).values("title", "price", "status").first()if not row_dict:return JsonResponse({"status": False, "error": "数据不存在。"})# 从数据库中获取到一个对象 row_objectresult = {"status": True,"data": row_dict}return JsonResponse(result)@csrf_exempt
def order_edit(request):""" 编辑订单 """uid = request.GET.get("uid")row_object = models.Order.objects.filter(id=uid).first()if not row_object:return JsonResponse({"status": False, "tips": "数据不存在。"})form = OrderModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return JsonResponse({"status": True})return JsonResponse({"status": False, "error": form.errors})
order_list.html
{% extends 'layout.html' %}{% block content %}
<div class="container"><div style="margin-bottom: 10px"><input type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal"><input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary"></div><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>订单列表</div><!-- Table --><table class="table table-bordered"><thead><tr><th>ID</th><th>订单号</th><th>名称</th><th>价格</th><th>状态</th><th>管理员</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr uid="{{ obj.id }}"><th>{{ obj.id }}</th><td>{{ obj.oid }}</td><td>{{ obj.title }}</td><td>{{ obj.price }}</td><td>{{ obj.get_status_display }}</td><td>{{ obj.admin.username }}</td><td><input uid="{{ obj.id }}" type="button" class="btn btn-primary btn-xs btn-edit" value="编辑"><input uid="{{ obj.id }}" class="btn btn-danger btn-xs btn-delete" type="button" value="删除"></td></tr>{% endfor %}</tbody></table></div><div class="clearfix"><ul class="pagination" style="float:left;">{{ page_string }}</ul></div>
</div><!-- 新建/编辑 订单(对话框) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">新建</h4></div><div class="modal-body"><form id="formAdd"><div class="clearfix">{% for field in form %}<div class="col-xs-6"><div class="form-group" style="position: relative;margin-bottom: 20px;"><label>{{ field.label }}</label>{{ field }}<span class="error-msg" style="color: red; position: absolute"></span></div></div>{% endfor %}</div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button><button id="btnSave" type="button" class="btn btn-primary">保 存</button></div></div></div>
</div><!--删除-->
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="alert alert-danger alert-dismissible fade in" role="alert"><h4>是否确定删除?</h4><p style="margin: 10px 0;">删除后可能会出现不一样的问题</p><p style="text-align: right;"><button id="btnConfirmDelete" type="button" class="btn btn-danger">确 定</button><button type="button" class="btn btn-default" data-dismiss="modal">取 消</button></p></div></div>
</div>
{% endblock %}{% block js %}
<script type="text/javascript">var DELETE_ID;var EDIT_ID;$(function () {bindBtnAddEvent();bindBtnSaveEvent();bindBtnDeleteEvent();bindBtnConfirmDeleteEvent();bindBtnEditEvent();})function bindBtnAddEvent() {$("#btnAdd").click(function () {//将正在编辑的ID设置为空EDIT_ID = undefined;//清空对话框中的数据$("#formAdd")[0].reset();//设置对话框的标题$("#myModalLabel").text("新建");//点击新建按钮,显示对话框$('#myModal').modal('show')});}function bindBtnSaveEvent() {$("#btnSave").click(function() {// 清除错误信息$("#error-msg").empty();if(EDIT_ID) {//编辑doEdit();} else {//添加doAdd();}});}function doEdit() {// 向后台发送请求$.ajax({url: "/order/edit/" + "?uid=" + EDIT_ID,type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if(res.status) {alert("修改成功");// 清空表单$("#formAdd")[0].reset();//关闭对话框$('#myModal').modal('hide');location.reload();} else {if (res.tips) {alert(res.tips);} else {$.each(res.error, function (name, errorList) {$("#id_" + name).next().text(errorList[0]);})}}}});}function doAdd() {// 向后台发送请求$.ajax({url: "/order/add/",type: "post",data: $("#formAdd").serialize(),dataType: "JSON",success: function (res) {if(res.status) {alert("创建成功");// 清空表单$("#formAdd")[0].reset();//关闭对话框$('#myModal').modal('hide');location.reload();} else {$.each(res.error, function (name, errorList) {$("#id_" + name).next().text(errorList[0]);})}}});}function bindBtnDeleteEvent() {$(".btn-delete").click(function() {//alert("点击了删除");$("#deleteModal").modal('show');//获取当前行的ID并赋值给全部变量DELETE_ID = $(this).attr("uid")});}function bindBtnConfirmDeleteEvent() {$("#btnConfirmDelete").click(function () {//点击确认删除按钮,将全局变量中设置的那个要删除ID发送到后台$.ajax({url: "/order/delete/",type: "GET",data: {uid: DELETE_ID},dataType: "JSON",success: function (res) {if(res.status){
<!-- //alert("删除成功");-->
<!-- //隐藏删除框-->
<!-- $("deleteModal").modal('hide');-->
<!-- //在页面上将当前一行数据删除(js)-->
<!-- $("tr[uid='" + DELETE_ID + "']").remove();-->
<!-- //要删除的ID置空-->
<!-- DELETE_ID = 0;-->//简单的实现思路location.reload();}else{//删除失败alert(res.error);}}})});}function bindBtnEditEvent() {$(".btn-edit").click(function () {//清空对话框中的数据$("#formAdd")[0].reset();var uid = $(this).attr("uid");EDIT_ID = uid;//发送Ajax去后端获取当前行的相关数据$.ajax({url: "/order/detail/",type: "get",data:{uid:uid},dataType:"JSON",success: function (res) {if(res.status) {//将数据赋值到对话框中的标签中$.each(res.data, function (name, value) {$("#id_" + name).val(value);})//修改对话框的标题$("#myModalLabel").text("编辑");//点击编辑,显示对话框$("#myModal").modal('show');} else {alert(res.error);}}})});}
</script>
{% endblock %}
导入echarts图表
出现图表加载不出来的问题
可能是
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js"></script>
放在了
<script type="text/javascript">// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('m1'));// 指定图表的配置项和数据var option = {title: {text: 'ECharts 入门示例'},tooltip: {},legend: {data: ['销量']},xAxis: {data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']},yAxis: {},series: [{name: '销量',type: 'bar',data: [5, 20, 36, 10, 10, 20]}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);
的后面了
相关文章:
Django学习第六天
启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时:对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…...
docker部署mycat,连接上面一篇的一主二从mysql
一、docker下载mycat镜像 查看安装结果 这个名称太长,在安装容器时不方便操作,设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个,主要目的是获得配置文件 docker run -it -d --name mycat -p 8066:…...
VUE2拖拽组件:vue-draggable-resizable-gorkys
vue-draggable-resizable-gorkys组件基于vue-draggable-resizable进行二次开发, 用于可调整大小和可拖动元素的组件并支持冲突检测、元素吸附、元素对齐、辅助线 安装: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…...
容器:stack
以下是关于stack容器的一些总结: stack容器比较简单,主要包括: 1、构造函数:stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素:top() 4、获取栈的大小:size() 5、判断栈是否为空&#x…...
跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3
没有Microsoft在其办公解决方案中提供的界面,就无法想象现代应用程序,这个概念称为Ribbon UI,目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibb…...
(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表(或元组)创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…...
在 Azure 云中开始使用适用于 Ubuntu 的 Grafana
介绍 Grafana 是一款开源工具,可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时,您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…...
1.Python学习笔记
一、环境配置 1.Python解释器 把程序员用编程语言编写的程序,翻译成计算机可以执行的机器语言 安装: 双击Python3.7.0-选择自定义安装【Customize installation】-勾选配置环境变量 如果没有勾选配置环境变量,输入python就会提示找不到命令…...
中英双语介绍百老汇著名歌剧:《猫》(Cats)和《剧院魅影》(The Phantom of the Opera)
中文版 百老汇著名歌剧 百老汇(Broadway)是世界著名的剧院区,位于美国纽约市曼哈顿。这里汇集了许多著名的音乐剧和歌剧,吸引了全球各地的观众。以下是两部百老汇的经典音乐剧:《猫》和《剧院魅影》的详细介绍。 1.…...
RpcChannel的调用过程
目录 1. RPC调用方(caller)的调用(消费)过程 2.在caller下创建文件:calluserservice.cc 3.在src的include下创建文件:mprpcchannel.h 4.在src下创建mprpcchannel.cc 1. RPC调用方(caller)的调用(消费)过…...
东芝TB6560AHQ/AFG步进电机驱动IC:解锁卓越的电机控制性能
作为一名工程师,一直在寻找可靠且高效的组件来应用于你的项目中。东芝的TB6560AHQ/AFG步进电机驱动IC能够提供精准且多功能的电机控制,完全符合现代应用的高要求,保证高性能和易用性。在这篇文章中,我们将探讨TB6560AHQ/AFG的主要…...
免杀笔记 ----> DLL注入
这段时间我们暂时没什么事情干的话我们就继续更新我们的免杀笔记力!!! :今天我们讲DLL注入 目录 1.DLL注入 2.直接加载DLL? 3.远程线程注入 获取Handle 远程申请内存空间 将我们的CS的DLL加载入内存 创建远程线…...
奇迹MU 骷髅战士在哪
BOSS分布图介绍 我为大家带来各地区怪物分布图。在游戏前期,很多玩家可能会不知道该去哪里寻找怪物,也不知道哪些怪物值得打。如果选择了太强的怪物,弱小的玩家可能会无法抵御攻击。如果选择了低等级的boss,收益可能并不理想。所…...
leetcode力扣_贪心思想
455.分发饼干(easy-自己想得出来并写好) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺…...
Vue中Class数据绑定
Class数据绑定 数据绑定的一个常见需求场景是操作CSS class列表,因为class是attribute(属性),我们可以和其他attribute一样使用v-bind 将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生…...
Python数据分析案例49——基于机器学习的垃圾邮件分类系统构建(朴素贝叶斯,支持向量机)
案例背景 trec06c是非常经典的邮件分类的数据,还是难能可贵的中文数据集。 这个数据集从一堆txt压缩包里面提取出来整理为excel文件还真不容不易,肯定要做一下文本分类。 虽然现在文本分类基本都是深度学习了,但是传统的机器学习也能做。本案…...
贪心算法-以学籍管理系统为例
1.贪心算法介绍 1.算法思路 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一 步都要确保能获得局部最优解。每一步只考虑一 个数据,其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起…...
PyCharm 安装
PyCharm是一种流行的Python集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能,如智能代码补全、实时错误检查、项目导航、调试工具以及版本控制等,极大地提高了Python开发人员的工作效率。以下是PyCharm安装…...
C++:对象指针访问成员函数
使用箭头操作符 (->):ptr->function() 是最常用和推荐的方式,因为它更简洁、更直观。箭头操作符 (->) 被设计为与点操作符 (.) 配合指针一起使用,以便通过指针访问对象的成员。 先解引用指针,然后使用点操作符 (.)&…...
Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧🐧Linux高级管理专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️…...
新手也能懂的SSRF漏洞实战:用iwebsec靶场复现文件读取与内网探测
从零开始掌握SSRF漏洞:iwebsec靶场实战指南1. 认识SSRF漏洞的本质想象一下,你正在一家高档餐厅点餐,服务员承诺可以帮你从任何地方获取食材——包括隔壁竞争对手的厨房。SSRF(Server-Side Request Forgery)漏洞就像这个…...
小米MIMO最新邀请码
欢迎使用,各得10元体验金...
告别FTP龟速:用NTFS-3G在CentOS7上直连移动硬盘拷贝200G大文件
告别FTP龟速:用NTFS-3G在CentOS7上直连移动硬盘拷贝200G大文件当面对数百GB的设计素材、日志文件或数据库备份需要迁移时,传统的FTP传输往往会成为效率瓶颈。我曾在一个视频处理项目中,需要将230GB的4K原始素材从移动硬盘导入服务器ÿ…...
从入门到实践:EEG公开数据集分类与应用场景全解析
1. EEG公开数据集入门指南刚接触脑电信号分析的研究者,常常会被一个问题困扰:"我应该从哪里获取可靠的EEG数据?"作为一个在这个领域摸爬滚打多年的研究者,我完全理解这种困惑。记得我第一次接触EEG研究时,光…...
荣耀出征官方网站下载正版手游 翅膀养成细节玩法全方位讲解
玩荣耀出征的玩家都清楚,翅膀不仅是角色的颜值象征,更是提升整体战力的核心途径。很多新手玩家只顾着升级、刷装备,完全忽略翅膀养成,导致等级很高但战力始终上不去。还有不少玩家胡乱合成、盲目进阶,浪费了大量稀有翅…...
论文写作效率翻倍?okbiye 毕业论文 AI 功能全解析:从需求到终稿的规范路径
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、从界面看本质:okbiye 毕业论文 AI 写作的设计逻辑 打开 okbiye 的毕业论文 AI 写作页面,首先能感受到的是清晰的…...
基于随机森林的低成本传感器机器学习校准实践指南
1. 项目概述:当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天,低成本传感器几乎无处不在。从监测办公室的空气质量,到追踪城市街道的噪音污染,再到农业大棚里的温湿度控制,这些价格亲民的“小眼睛…...
如何快速掌握MoveIt2:面向ROS 2开发者的工业机器人运动规划完整指南
如何快速掌握MoveIt2:面向ROS 2开发者的工业机器人运动规划完整指南 【免费下载链接】moveit2 :robot: MoveIt for ROS 2 项目地址: https://gitcode.com/gh_mirrors/mo/moveit2 想要为你的机器人实现智能运动规划吗?MoveIt2作为ROS 2生态中最强大…...
艾尔登法环存档迁移终极指南:3分钟解决角色转移难题
艾尔登法环存档迁移终极指南:3分钟解决角色转移难题 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档版本不兼容而烦恼吗?EldenRingSaveCopier 是你的终极解决…...
从无线破解到PDF解密:盘点那些容易被忽略的‘非主流’密码审计场景与工具
密码安全审计的隐秘战场:从无线网络到加密文档的实战指南 当大多数人谈论密码安全时,脑海中浮现的往往是服务器登录、数据库访问这些企业级场景。然而在数字生活的每个角落,从家庭Wi-Fi到工作文档,密码保护的脆弱性同样可能成为安…...
