django学习入门系列之第十点《A 案例: 员工管理系统21》

news2024/11/19 18:25:51

文章目录

  • 16 Ajax(订单案例)
    • 16.9 编辑
      • 想要去数据库中获取数据时:对象/字典
      • 将具体内容的错误信息传入到前端(Ajax)
      • 将数据库数据传入前端(Ajax)
        • 清空新建订单的数据
    • 16.10 编辑后保存
  • 往期回顾


16 Ajax(订单案例)

16.9 编辑

  • 点击编辑后,从数据库中拿数据

    • 方式一:
    function bindBtnEditEvent() {
                $(".btn-edit").click(function () {
                    {#获取当前uid#}
                    var uid = $(this).attr("uid");
    
                    {#发送Ajax去后端获取当前行的相关数据,传到后台的值为 /order/detail/?uid=  #}
                    $.ajax({
                        {#拼接字符串#}
                        url: "/order/detail/",
                        type: "get",
                        data: {
                            uid: uid
                        },
                        dataType: "JSON",
                        success: function (res) {
                            if (res.status) {
                                {#要当数据获取成功了才能展示对话框#}
                                {#记得要修改对话框的标题#}
                                $('#myModalLabel').text("编辑订单")
                                {#为了方便,公用一个对话框#}
                                $('#myModal').modal('show');
    
                            } else {
                                alert(res.error);
                                {#隐藏对话框#}
                                $("#myModal").modal('hide');
                                {#刷新页面#}
                                location.reload();
                            }
                        }
                    })
                    {#在对话框中默认看到#}
                })
            }
    

    这样可以返回数据,自己构造出一个字典,但是缺点是比较麻烦

    因为json进行序列化的时候,不支持对象,只支持python里面的数据类型

    def order_detail(request):
        """根据id获取订单消息"""
        uid = request.GET.get("uid")
        row_object = models.Order.objects.filter(id=uid).first()
        if not row_object:
            return JsonResponse({"status": False, 'error': "数据不存在"})
    
        result = {
            "status": True,
            "data":{
              "title": row_object.title,
              "price": row_object.price,
              "status": row_object.status,
            }
        }
        return JsonResponse(result)
    

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

在这里插入图片描述

  • 因为first拿的是第一个,所以拿的是对象
  • 如果是values_list,则拿的是元组

所以

frist  ------- 对象
values  ------- 字典
values_list  ------- 元组
  • 方式二
def order_detail(request):
    """根据id获取订单消息"""
    uid = request.GET.get("uid")
    # 这样可以直接帮你构成一个字典,就不用自己写了
    row_object = models.Order.objects.filter(id=uid).values("title", "price", "status").first()
    if not row_object:
        return JsonResponse({"status": False, 'error': "数据不存在"})

    result = {
        "status": True,
        "data": row_object
    }
    return JsonResponse(result)

将具体内容的错误信息传入到前端(Ajax)

$.each(res.error, function (name, data) {
                                console.log(name, data);
                                $("#id_" + name).next().text(data[0]);
                            })

将数据库数据传入前端(Ajax)

$.each(res.data, function (name, data) {
                                console.log(name, data);
                                $("#id_" + name).val(data);})
清空新建订单的数据
  • 因为新建和编辑用的是同一个对话框,所以当后端数据显示在前端的时候,新建对话框也会出现,所以要清除
$("#需要清除的表单")[0].reset();
$("#add_form")[0].reset();
  • 所以,建议都默认先清空在获取值

16.10 编辑后保存

  • 定义一个全局变量EDIT_ID
这个全局变量是编辑的id号
注意逻辑判断
	1:当是未定义的状态时,则为添加按钮
	2:当时定义状态的时候,则视为编辑保存的按钮
@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})

    # 如果时error,希望把错误信息全部显示到下方,这个是字段的
    return JsonResponse({"status": False, 'error': form.errors})
{% extends 'model.html' %}
{% block content %}
    <div class="container">
        <div>
            <input id="Btnadd" type="button" value="新建订单" class="btn btn-success"/>
        </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">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel"></h4>
                </div>
                <div class="modal-body">
                    <form id="add_form">
                        <div class="clearfix">
                            {% for foo in form %}
                                <div class="col-xs-6">
                                    <div class="form-group">
                                        <label>{{ foo.label }} </label>
                                        {{ foo }}
                                        {# 添加一个绝对的定位,用来定位他的错误信息    #}
                                        <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>删除后,所有关联的相关数据都会被删除</p>
                <p style="text-align: right">
                    <button type="button" id="btnConfigDelete" class="btn btn-danger">确定</button>
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                </p>
            </div>
        </div>
    </div>

    <div class="bs-example container" data-example-id="panel-without-body-with-table">
        <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 foo in queryset %}
                    <tr>
                        <th scope="row">{{ foo.id }}</th>
                        <td>{{ foo.get_status_display }}</td>
                        <td>{{ foo.oid }}</td>
                        <td>{{ foo.title }}</td>
                        <td>{{ foo.price }}</td>
                        <td>{{ foo.admin.username }}</td>
                        <td>
                            <a href="/admin/{{ foo.id }}/reset/">
                                重置密码
                            </a>
                        </td>
                        <td>
                            <input uid={{ foo.id }} type="button" value="编辑" class="btn btn-xs btn-primary btn-edit"/>
                            <input uid={{ foo.id }} type="button" value="删除"
                                   class="btn btn-xs btn-delete btn-danger"/>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <div>
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    {{ page_string }}
                </ul>
            </nav>
        </div>
        <div>
            <form method="get">
                <div class="input-group" style="width: 200px">
                    <input type="text" name="page" class="form-control" placeholder="页码">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">跳转</button>
                    </span>
                </div>
            </form>
        </div>
    </div>



{% endblock %}


{% block apply_js %}
    <script type="text/javascript">
        {# 创建一个全局变量用来记录用户是否要进行删除操作 #}
        var DELETE_ID;
        var EDIT_ID;

        $(function () {
            bindBtnEvent();
            bindBtnSaveEvent();
            bindBtnDeleteEvent();
            bindBtnEditEvent();
        })

        function bindBtnEvent() {
            $("#Btnadd").click(function () {
                {#如果不这样设置,则点编辑再点保存则会串号#}
                EDIT_ID = undefined;
                $("#add_form")[0].reset();
                $('#myModalLabel').text("新建订单")
                $('#myModal').modal('show')
            })
        }

        function bindBtnSaveEvent() {
            $("#btnSave").click(function () {

                $('.error-msg').empty()

                if (EDIT_ID) {
                    //编辑
                    Ed_add()
                } else {
                    //添加
                    Ne_add()
                }
            })
        }

        function Ed_add(){
             $.ajax({
                url: "/order/edit/" + "?uid=" + EDIT_ID,
                type: "post",
                {#这样相当于帮你把所有制都给传过去了#}
                data: $('#add_form').serialize(),
                dataType: "JSON",
                success: function (res) {
                    if (res.status) {
                        alert("已成功保存");
                        {#清空表单 $("#add_form")是jQuery对象 -> S("#add_form")[0] DOM对象#}
                        $("#add_form")[0].reset();

                        {#隐藏对话框#}
                        $("#myModal").modal('hide');

                        {#刷新页面#}
                        location.reload()
                    } else {
                        if(res.tips){
                            {#防止他整体数据不存在#}
                            alert(res.tips);
                        }
                        else {
                        $.each(res.error, function (name, data) {
                            $("#id_" + name).next().text(data[0]);
                        })
                        }
                    }
                }
            })
        }

        {#新建保存的函数#}
        function Ne_add() {
            $.ajax({
                url: '/order/add/',
                type: "post",
                {#这样相当于帮你把所有制都给传过去了#}
                data: $('#add_form').serialize(),
                dataType: "JSON",
                success: function (res) {
                    if (res.status) {
                        alert("已成功保存");
                        {#清空表单 $("#add_form")是jQuery对象 -> S("#add_form")[0] DOM对象#}
                        $("#add_form")[0].reset();

                        {#隐藏对话框#}
                        $("#myModal").modal('hide');

                        {#刷新页面#}
                        location.reload()
                    } else {
                        $.each(res.error, function (name, data) {
                            console.log(name, data);
                            $("#id_" + name).next().text(data[0]);
                        })
                    }
                }
            })
        }


        function bindBtnDeleteEvent() {
            $(".btn-delete").click(function () {
                // 点击按钮,显示对话框
                $('#deleteModal').modal('show')

                {# 获取当前id并赋值给全局变量   #}
                DELETE_ID = $(this).attr("uid");
            })
        }

        function bindBtnConfigDeleteEvent() {
            $("#btnConfigDelete").click(function () {
                // 点击确定删除按钮,将全局变量的值发送到后台
                $.ajax({
                    {#拼接字符串#}
                    url: "/order/" + DELETE_ID + "/delete/",
                    type: "get",
                    {#这样相当于帮你把所有制都给传过去了#}
                    data: $('#add_form').serialize(),
                    dataType: "JSON",
                    success: function (res) {
                        if (res.status) {
                            alert("已成功删除");
                            {#隐藏对话框#}
                            $("#myModal").modal('hide');
                            {#刷新页面#}
                            location.reload();

                            {# 将id重置  #}
                            DELETE_ID = 0

                        } else {
                            alert(res.error);
                            {#隐藏对话框#}
                            $("#myModal").modal('hide');
                            {#刷新页面#}
                            location.reload();
                        }
                    }
                })
            })
        }

        function bindBtnEditEvent() {
            $(".btn-edit").click(function () {
                $("#add_form")[0].reset();
                {#获取当前uid#}
                var uid = $(this).attr("uid");

                EDIT_ID = uid;

                {#发送Ajax去后端获取当前行的相关数据,传到后台的值为 /order/detail/?uid=  #}
                $.ajax({
                    {#拼接字符串#}
                    url: "/order/detail/",
                    type: "get",
                    data: {
                        uid: uid
                    },
                    dataType: "JSON",
                    success: function (res) {

                        if (res.status) {
                            $.each(res.data, function (name, data) {
                                console.log(name, data);
                                $("#id_" + name).val(data);
                            })
                            {#要当数据获取成功了才能展示对话框#}
                            {#记得要修改对话框的标题#}
                            $('#myModalLabel').text("编辑订单")

                            {#为了方便,公用一个对话框#}
                            $('#myModal').modal('show');

                        } else {
                            alert(res.error);
                            {#隐藏对话框#}
                            $("#myModal").modal('hide');
                            {#刷新页面#}
                            location.reload();
                        }
                    }
                })
                {#在对话框中默认看到#}
            })

        }
    </script>
{% endblock %}

往期回顾

1.【快速开发网站】
2.【浏览器能识别的标签1】
3.【浏览器能识别的标签2】
4.【浏览器能识别的标签3】
5.【浏览器能识别的标签4】
6.【案例1:用户注册】
7.【案例2:用户注册改进】
8.【快速了解 CSS】
9.【常用选择器概念讲解】
10.【CSS基础样式介绍1】
11.【CSS基础样式介绍2】
12.【CSS基础样式介绍3】
13.【CSS基础样式介绍3】
14.【案例 小米商城头标】
15.【案例 小米商城头标总结】
16.【案例 小米商城二级菜单】
17.【案例 商品推荐部分】
18.【伪类简单了解】
19.【position】
20.【案例 小米商城中app图标代码】
21.【边框及总结】
22.【BootSrap初了解】
23.【BootSrap的目录栏】
24.【BootSrap的栅格系统】
25.【案例 博客案例】
26.【案例 登录】
27.【案例 后台管理样例】
28.【图标】
29.【BootStrap依赖】
30.【javascript初了解】
31.【jJavaScript的变量】
32.【JavaScript的字符串类型】
33.【JavaScript的数组介绍】
34.【案例 动态数据】
35.【javascript 对象(字典)】
36.【案例 动态表格】
37.【Javascript的条件语句和函数】
38.【DOM初了解】
39.【DOM的事件了解】
40.【jQuery初了解】
41.【jQuery寻找标签】
42.【jQuery寻找标签2】
43.【jQuery寻找标签(间接寻找)】
44.【案例 菜单的切换】
45.【案例 只能打开一个菜单】
46.【jQuery 简单操作】
47.【案例 动态创建数据】
48.【案例 点击获取文本】
49.【案例 点击删除文本】
50.【案例 表格操作】
51.【案例 添加页面】
52.【初识MySQL】
53.【MySQL命令介绍一】
54.【MySQL命令介绍二】
55.【MySQL命令介绍三】
56.【案例:员工管理】
57.【案例 Flask+MySQL新增用户】
58.【案例 Flask+MySQL查询所有用户】
59.【初识 django】
60.【django的快速上手】
61.【django的模板语法】
62.【django的获取请求与响应】
63.【案例 用户登录】
64.【django中数据库操作】
65.【django中数据库操作–创建与删除表】
66.【django中数据库操作–操作表中的数据】
67.【案例 用户管理】
68.【A 案例: 员工管理系统1】
69.【A 案例: 员工管理系统2】
70.【A 案例: 员工管理系统3】
71.【A 案例: 员工管理系统4】
72.【A 案例: 员工管理系统5】
73.【A 案例: 员工管理系统6】
74.【A 案例: 员工管理系统7】
75.【A 案例: 员工管理系统8】
76.【A 案例: 员工管理系统9】
77.【A 案例: 员工管理系统10】
78.【A 案例: 员工管理系统11】
79.【A 案例: 员工管理系统12】
80.【A 案例: 员工管理系统13】
81.【A 案例: 员工管理系统14】
82.【A 案例: 员工管理系统15】
83.【A 案例: 员工管理系统16】
84.【A 案例: 员工管理系统17】
85.【A 案例: 员工管理系统18】
86.【A 案例: 员工管理系统19】
86.【A 案例: 员工管理系统20】

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

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

相关文章

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测 目录 TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料预测效果

Python第一篇:Python解释器

一&#xff1a;python解释器 python解释器是一款程序&#xff0c;用于解释、执行Python源代码。 一般python解释器都是c python使用c编写的&#xff0c;还有j python用java编写的。 二&#xff1a;python下载 三&#xff1a;使用示例 python进入控制台&#xff0c;python。 三…

【react案例】实现评论列表

1. 需求 展示评论列表实现删除功能 2.1 只有自己的评论才展示删除按钮 2.2 点击删除按钮&#xff0c;删除当前评论tab切换&#xff08;点击对应tab&#xff0c;对tab文案高亮处理&#xff09;评论高亮评论排序&#xff08;最新、最热&#xff09; 2. 实现思路 useState维护评…

基于vue框架的大同传统文化非物质文化宣传管理系统jzo9d(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,非遗类型,文化遗产 开题报告内容 基于Vue框架的大同传统文化非物质文化宣传管理系统开题报告 一、研究背景 在全球化加速的今天&#xff0c;传统文化的保护与传承面临着前所未有的挑战。大同&#xff0c;作为中国历史文化名城&a…

职场能力强的人都在做什么---今日头条

【职场里,能力强的人都在做哪些事... - 今日头条】https://m.toutiao.com/is/ikn6kt9q/ 知识雷达 2024-09-21 16:33 目录 职场里,能力强的人都在做哪些事呢? 1、复盘; 2、多角度思考;3、记录信息; 4、永远积极主动;5、主动获取信息差; 6、明确人和人的关系;7、…

STM32杂项

STM32杂项 1.启动过程2.中断3.GPIO4.Systick5.串口printf6.独立看门狗 记录单片机在工作中遇到的问题和特殊情况。 1.启动过程 M3/M4/M7内核复位后&#xff0c;做的第一件事&#xff1a; 1.从地址0x0000 0000处取出堆栈指针MSP的初始值&#xff0c;该值就是栈顶地址。 2.从地址…

2024必备中英互译利器全知道

现在英语目前还是学习最广泛的第二语言&#xff0c;所以很多资料都有英文的版本。如果外语不好&#xff0c;那中英互译翻译工具就能帮我们解决这个问题。今天我们一起来探讨下有哪些好用的翻译工具。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这个工具…

【linux】进度条

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.屏幕缓冲区换行&#xff08;LF, \n&#xff09;和回车&#xff08;CR, \r&#xff09;换行回车在屏幕缓冲区中的作用代码块1&#xff1a;代码块2&#xff1a; 02.进度条优化版…

SpringBoot3+Swagger3(最新版springdoc-openapi教程)

第一步&#xff1a;引入springdoc-openapi依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency> 第二步&#xff1a; 配置…

打开ffmpeg编码器的时候报错:avcodec_open2()返回-22

[h264_v4l2m2m 0x555555617a00] Could not find a valid device [h264_v4l2m2m 0x555555617a00] cant configure encoder 前言&#xff1a;先做一个操作&#xff0c;查找编码器的时候&#xff0c;使用名字查找的方式&#xff1a; const AVCodec *avcodec_find_encoder_by_n…

ubuntu数据硬盘故障导致系统启动失败

背景&#xff1a; 系统盘损坏或者/etc/fatab误修改导致开机启动挂载失败系统无法启动 解决方法 重启

BFS 解决最短路径问题, 迷宫中离入口最近的出口,最小基因变化,单词接龙,为高尔夫比赛砍树

文章目录 1926. 迷宫中离入口最近的出口433. 最小基因变化127. 单词接龙675. 为高尔夫比赛砍树 1926. 迷宫中离入口最近的出口 边权为1的最短路径问题 我们要知道上下左右都是可以走的 &#xff08;用队列&#xff09;走过的地方不要在走了&#xff0c;这样会进入死循环&#x…

零信任内网安全访问

随着互联网的持续发展&#xff0c;便捷的共享方式极大地提高了企业的生产力和工作效率&#xff0c;但随之也给企业内网带来了极大的安全隐患。企业内网承载大量的核心资产和机密数据&#xff0c;一旦受到攻击可能会造成大量损失&#xff0c;因此&#xff0c;如何通过零信任内网…

快手一面:给定一棵二叉树,要求将其转换为其镜像?

目录标题 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09;问题描述示例解题思路代码实现详细分析复杂度分析优点注意事项&#x1f495; 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09; 问题描述 给定一棵二叉树&#xff…

探索AI新纪元:揭秘Mammoth库的神秘面纱

文章目录 探索AI新纪元&#xff1a;揭秘Mammoth库的神秘面纱背景&#xff1a;为何选择Mammoth&#xff1f;简介&#xff1a;Mammoth是什么&#xff1f;安装&#xff1a;如何获取Mammoth&#xff1f;使用&#xff1a;Mammoth的基本函数场景应用&#xff1a;Mammoth在实际中的运用…

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

宠物空气净化器和普通的空气净化器有区别吗?哪款能吸猫毛

这不是国庆节要来了吗&#xff0c;想着假期变多了可以多陪一下自家的小猫咪&#xff0c;但是也怕猫咪的毛发太多让我产生退缩的念头。 刚开始养的时候&#xff0c;我就知道猫咪是会掉毛的&#xff0c;毕竟猫咪的毛发这么旺盛&#xff0c;掉毛也是正常的&#xff0c;但是我似乎…

SpringCloud源码:客户端分析(二)- 客户端源码分析

背景 我们继续分析EurekaClient的两个自动化配置类&#xff1a; 自动化配置类功能职责EurekaClientAutoConfiguration配置EurekaClient确保了Eureka客户端能够正确地&#xff1a;- 注册到Eureka服务端- 周期性地发送心跳信息来更新服务租约- 下线时通知Eureka服务端- 获取服务实…

Qt网络编程——QUdpSocket

文章目录 Qt网络编程QUdpSocketUdp回显服务器Udp客户端 Qt网络编程 网络编程本质上是写应用层代码&#xff0c;需要传输层提供支持。 而传输层最核心的协议就是UDP和TCP&#xff0c;这两个协议有较大差别&#xff0c;所以Qt提供了两套API。 要是有Qt网络编程的API&#xff0…

9.23-9.25学习

前置知识 docker&#xff1a;Docker-CSDN博客 docker安装mysql和 redis&#xff1a;https://blog.csdn.net/weixin_73118927/article/details/142530243?fromshareblogdetail&sharetypeblogdetail&sharerId142530243&sharereferPC&sharesourceweixin_7311892…