继上一篇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有又能够自动识别主键的机制。

posted @ 2019-10-22 19:47  chanyuli  阅读(1478)  评论(0编辑  收藏  举报