• 继上一篇Django的数据库数据的编辑和删除


    继上一篇Django的数据库数据的编辑和删除

    首先需要写一个能够展示数据库一张表中所有数据的 html 页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        {% load static %}
        <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
        <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h1 class="text-center">数据展示</h1>
                <table class="table table-hover table-striped table-bordered">
                    <thead>
                        <tr >
                            <th>主键值</th>
                            <th>用户名</th>
                            <th>密码</th>
                            <th class="text-center">操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for user_obj in user_queryset %}
                            <tr>
                                <td>{{ user_obj.id }}</td>
                                <td>{{ user_obj.username }}</td>
                                <td>{{ user_obj.password }}</td>
                                <td class="text-center">
                                    <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-sm">编辑</a>
                                    <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger btn-sm">删除</a>
                                </td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    </body>
    </html>
    

    上面的两个 a 标签,一个是编辑一个是删除,点击会跳转到对应的 html 页面。

    注意: href 里的链接,一定要在前面加上一个 "/" ,这样他的跳转才会是‘’http://127.0.0.1:8001/edit_user/?edit_id=1‘’ ,如果你没有加上斜杆,点击将会失效,每次点击都会拼接上一个edit_user,而不会跳转到对应的 html 界面。

    views 里的业务逻辑:

    def userlist(request):
        # 获取用户表中的所有的数据
        user_queryset = models.Userinfo.objects.all()  # 结果类似于列表套数据对象 里面是当前表的所有数据对象
        # print(user_queryset.query)  # 只有queryset对象才能够点query查询内部所对应的sql语句
        # print(user_queryset)
        # 将数据传递给前端页面展示给用户看
        return render(request,'userlist.html',locals())
    

    这里会把所有的数据都传到前端,前端展示。

    当用户点击了编辑以后,就会跳转到编辑界面,以下是编辑的逻辑代码:

    def edit_user(request):
        # 1.如何获取用户想要编辑的数据
        edit_id = request.GET.get('edit_id')
        if request.method == 'POST':
            # 将用户新修改的所有的数据
            username = request.POST.get("username")
            password = request.POST.get("password")
            """POST中也是可以获取GET请求携带的参数"""
            # 去数据库中修改对应的数据
            # 方式1:
               models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password)					      				
              
                # 批量更新
            # 方式2: 获取当前数据对象 然后利用对象点属性的方式 先修改数据  然后调用对象方法保存
            # 不推荐你使用第二种方式  效率低   挨个重新写入一遍
            # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk能够自动帮你查询出当前表的主键字段名
            # edit_obj.username = username
            # edit_obj.password = password
            # edit_obj.save()
            """update方法会将filter查询出来的queryset对象中所有的数据对象全部更新"""
            # 跳转到数据展示页面
            return redirect('/user_list')
        # 2.根据主键值去数据库中查询出当前对象 展示给用户看
        edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk能够自动帮你查询出当前表的主键字段名
        # 3.将查询出来的数据对象传递给前端页面 展示给用户看
        return render(request,'edit_user.html',locals())
    

    获取到前端传来的数据之后,直接查询,然后修改,最后在重定向到userlist界面

    编辑界面前端代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h2 class="text-center">编辑页面</h2>
                <form action="" method="post">
                    username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}">
    
                    password:<input type="text" class="form-control" name="password" value="{{ edit_obj.password }}">
    
                    <br>
                    <input type="submit" class="btn btn-warning">
                </form>
    
            </div>
        </div>
    </div>
    </body>
    </html>
    

    通过submit向后端发送数据,然后后端(也就是上面的逻辑代码)进行处理修改,最后在重定向到展示界面,这时候数据已经修改了。

    删除的业务逻辑:

    def delete_user(request):
        # 获取想要删除的数据id 直接删除
        delete_id = request.GET.get('delete_id')
        models.Userinfo.objects.filter(pk=delete_id).delete()  # 批量删除
        return redirect('/userlist')
    
    

    在user_list界面点击了删除按钮以后,会调用 delete_user方法,删除之后重定向。

    这里要注意:每次点击删除按键,都相当于删除了数据库中的相关记录,并且重定向到这个页面,也就相当于刷新了页面。

    user_list 界面有很多条数据,也有很多个编辑、删除按键,那么怎么样才能让后端知道我们要操作的是哪一条数据呢?

    答:因为我们在user_list里面传了一个列表套数据到前端去,所以前端可以直接获取每条记录的id值,那么前端获取了每一个id之后,把它和每个编辑以及删除一一对应,也就是a标签里的url,所以每个后端逻辑代码都可以接收到唯一的id值,就可以进行操作了。

    值得一提的是,也是重点,pk等于id,并且推荐用pk,Django有又能够自动识别主键的机制。

  • 相关阅读:
    关于用户体验的几张图片
    上下翻滚JS特效代码
    关注程序员健康之——缺失营养时的六种信号
    C#基础知识系列之——for循环
    关于程序中的需求的变化,责任的分配
    Silverlight学习之——Canvas对象
    还是觉得应该动手写点东西....
    怎样理解“道不同,不相为谋”这句话呢。。。
    UML图中最基本的是类图
    .NET中各种数据库连接大全
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11722061.html
Copyright © 2020-2023  润新知