Django框架学习笔记(四)

本文介绍了如何在班级表管理中使用模态框进行编辑和删除操作,通过Ajax与后端交互,实现实时更新而无需刷新页面。文章详细展示了在Django框架下,前后端分离的实现方式,包括视图函数、HTML模板和JavaScript代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇 简单了解了模态框和Ajax的结合使用,在此基础上,还可以实现班级表的对话框式的编辑和删除操作
urls.py中增加:

path('modal_edit_class/', views.modal_edit_class),
path('modal_del_class/', views.modal_del_class),

views.py增加:

def modal_add_class(request):
    class_title = request.POST.get('title')
    if len(class_title) > 0:
        sqlHelper.modify("insert into class(title) values(%s)", [class_title])
        return HttpResponse('ok')
        # return redirect('/classes')
    else:
        return HttpResponse('标题不能为空')


def modal_edit_class(request):
    ret = {'status': True, 'message': None}
    try:
        class_id = request.POST.get('edit_id')
        class_title = request.POST.get('edit_title')
        sqlHelper.modify("update class set title=%s where id=%s",
                         [class_title, class_id])
    except Exception as e:
        ret['status'] = False
        ret['message'] = str(e)
    return HttpResponse(json.dumps(ret))


def modal_del_class(request):
    ret = {'status': True, 'message': None}
    try:
        class_id = request.POST.get('edit_id')
        sqlHelper.modify("delete from class where id=%s", [class_id])
    except Exception as e:
        ret['status'] = False
        ret['message'] = str(e)
    return HttpResponse(json.dumps(ret))

classes.html修改为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>
    <style type="text/css">
        .hide{display: none;}
        .shadow{
            position: fixed;
            left:0;
            right: 0;
            top: 0;
            bottom: 0;
            background-color: rgba(0,0,0,0.4);
            z-index: 9999;
        }
        .modal{
            z-index: 10000;
            position: fixed;
            left: 50%;
            top: 50%;
            width: 400px;
            height: 300px;
            background-color: #fff;
            margin-left: -200px;
            margin-top: -150px;
        }
    </style>
</head>
<body>
<h1>班级列表</h1>
<div>
    <a href="/add_class/">添加班级</a>
    <a href="#" onclick="showModal()">对话框添加</a>
</div>

<div id="shadow" class="shadow hide">

</div>
{#<div id="modal" class="modal hide">#}
{#    <h1>添加班级</h1>#}
{#    form表单提交,页面会刷新#}
{#    <form action="/modal_add_class/" method="post">#}
{#        <label for="class_name">班级名称:</label>#}
{#        <input type="text" id="class_name" name="title"/>#}
{#        <input type="submit" value="提交">#}
{#    </form>#}
{##}
{#</div>#}
<div id="modal" class="modal hide">
    <h1>添加班级</h1>
    <label for="class_name">班级名称:</label>
    <input type="text" id="class_name" name="title"/><br/>
    <input type="button" value="提交" onclick="ajaxSend();"/>
    <input type="button" value="取消" onclick="cancelSend();"/>
    <span style="color:red;" id="errorMsg"></span>
</div>

<div id="editModal" class="modal hide">
    <h1>编辑班级</h1>
    <label for="class_name">班级名称:</label>
    <input type="text" id="editId" name="editId" hidden/>
    <input type="text" id="editTitle" name="editTitle"/>
    <input type="button" value="提交" onclick="editAjaxSend()"/>
    <input type="button" value="取消" onclick="cancelSend()"/>
    <span id="errorMsg"></span>
</div>
<table border="1">
    <thead>
    <tr>
        <th>班级ID</th>
        <th>班级名称</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for class_item in class_list %}
        <tr>
            <td>{{ class_item.id }}</td>
            <td>{{ class_item.title }}</td>
            <td>
                <a href="#" onclick="modalEdit(this)">对话框编辑</a>
                <a href="/edit_class/?cid={{ class_item.id }}">编辑</a>
                |
                <a href="/del_class/?cid={{ class_item.id }}">删除</a>
                <a onclick="modalDel(this)">对话框删除</a>
            </td>
        </tr>
    {% endfor %}

    </tbody>
</table>
<script type="text/javascript" src="/static/js/jquery-1.12.0.min.js"></script>
<script type="text/javascript">
    function showModal(){
        document.getElementById('shadow').classList.remove('hide');
        document.getElementById('modal').classList.remove('hide');
    }

    function cancelSend(){
        document.getElementById('shadow').classList.add('hide');
        document.getElementById('modal').classList.add('hide');
        document.getElementById('editModal').classList.add('hide');
    }

    function modalEdit(that){
        document.getElementById('shadow').classList.remove('hide');
        document.getElementById('editModal').classList.remove('hide');
        /**
         * 1.获取当前点击标签
         * 2.当前标签父标签,再找其上方标签
         * 3.获取当前行班级名称,赋值到编辑对话框中
         */
        let row = $(that).parent().prevAll();
        $("#editTitle").val($(row[0]).text());
        $("#editId").val($(row[1]).text());
    }

    function ajaxSend(){
        $.ajax({
            url:'/modal_add_class/',
            type: 'post',
            data: {'title': $("#class_name").val()},
            success:function(data){
                //当服务器处理完成后返回数据时,函数自动调用,服务端返回的数据存在data中
                if(data === 'ok'){
                    location.href='/classes/';
                }else{
                   $("#errorMsg").text(data);
                }
            }
        })
    }

    function editAjaxSend(){
        $.ajax({
            url:'/modal_edit_class/',
            type:'post',
            data:{'edit_id': $("#editId").val(),'edit_title':$("#editTitle").val() },
            success:function(data){
                // data是字符串类型
                // JSON.parse(字符串) ==> 对象
                // JSON.stringify(对象)=> 字符串
                data = JSON.parse(data);
                if(data.status){
                    location.reload(); // 当前页面刷新
                }else{
                    alert(data.message);
                }
            }
        })
    }

    function modalDel(that){
        let edit_id = $($(that).parent().prevAll()[1]).text();
        $.ajax({
            url:'/modal_del_class/',
            type:'post',
            data:{'edit_id':edit_id},
            success:function(data){
                data = JSON.parse(data);
                if(data.status){
                    location.reload(); // 当前页面刷新
                }else{
                    alert(data.message);
                }
            }
        })
    }
</script>
</body>
</html>
内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值