前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django框架开发016期 数据的更新,用户信息更新页面开发

Django框架开发016期 数据的更新,用户信息更新页面开发

作者头像
刘金玉编程
发布2024-04-10 10:07:39
760
发布2024-04-10 10:07:39
举报
文章被收录于专栏:编程创造城市编程创造城市

django orm开发的主要目的是为了能够尽可能少通过sql语句操作数据库,这样就可以使得没有学习过数据库的朋友也能够开发一个自己的动态网站。但是,我个人在使用过程中,还是推荐需要提前掌握好数据库基础知识。

您可以去学习刘金玉的《零基础数据库教程》,这样可以更清晰地理解django程序数据的增删改查。您可以通过官网 https://www.bcczcs.com 学习到相应的课程。

本节主要为朋友介绍通过django的orm模式如何更新用户的信息,你会发现使用django开发网站,在数据操作上变得更加简单!

本节教程属于《刘金玉的Django网站开发课程》电子书第五章第六节。对该电子书感兴趣的小伙伴,欢迎结合软件资源配套购买。

用户信息更新页面的开发整个逻辑流程也都是类似于注册和查询页面的开发过程。我们先对整个更新页面的逻辑做一个整体规划。

1)修改用户信息列表页面,在表的最后添加功能操作列,可以用来点击后编辑用户。

2)添加路由,获取指定用户数据到编辑表单中,获取数据通过视图页面开发。

3)添加路由,将编辑后的保单信息做一个保存,保存的内容通过视图函数开发。

下面分步骤详细讲解各个页面的开发。

第1步:修改ljyUserList页面,最后增加“编辑”功能。

在用户列表的表格最后增加功能一列以后修改后的页面如下图所示。

表格的html代码如下所示:

代码语言:javascript
复制
<table>
    <tr>
        <th>编号</th>
        <th>账号</th>
        <th>密码</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>#</th>
    </tr>
    {%for user in userlist%}
    <tr>
        <td>{{user.userID}}</td>
        <td>{{user.username}}</td>
        <td>{{user.password}}</td>
        <td>{{user.truename}}</td>
        <td>{{user.sex}}</td>
        <td>{{user.age}}</td>
        <td><a href="/edituser/{{user.userID}}/">编辑</a></td>
    </tr>
    {%endfor%}
</table>

从代码可以看出,我们的编辑功能实际上就是跳转到一个url页面,而这个url中含有当前用户的用户编号(这个编号不能被改变,是主键)。这个url跳转过去的页面需要我们自行创建。

第2步:创建url路由规则。

首先我们在路由中增加一条新的url路由规则,这里我们使用与以往不同的路由规则,就是传参的功能,应该如何写呢?请看如下代码:

代码语言:javascript
复制
path('edituser/<int:userID>/', views.getLjyUserByUserID),

我们发现在这个路由规则中,我们增加了新的符号<int:userID>,大家注意,这个就是Django框架中由url传递给视图函数参数的一种方法。由于我们的用户编号userID数值类型,所以我们直接使用数值类型的检测<int:参数>这样的形式。这种方式会检查参数是否是数值,如果不是,则到不了路由对应的视图。这里的int就是我们平时所说的integer类型,即整型,使用的使用只要注意格式是带有尖括号的形式,类型后面使用英文冒号即可,路由对应的视图的位置还是没有变化,我们这里新建一个视图getLjyUserByUserID来接收userID参数,并用该视图返回获得的用户对象数据。

第3步:获取传入的userID的用户数据。

现在我们来看看如何写视图getLjyUserByUserID?这个视图的名称我们取得也是有含义的,意思是根据userID获取用户对象数据。

代码语言:javascript
复制
#根据userID获取指定的用户信息,用来更新指定的用户信息
def getLjyUserByUserID(request,userID):#这里的第二个参数userID就是从路由传递而来的
    try:
        curuser=LjyUser.objects.get(userID=userID) #这里使用异常检测机制,当无法获取到用户数据时,会抛出异常,否则就是返回单个用户对象实例
    except:
        return HttpResponse('找不到该用户 <a href="/users/">返回用户列表</a>') #如果抛出异常,那么页面上返回执行的html文字

    return render(request,'ljyblog/ljyEditUser.html',{'currentUser':curuser}) ##将当前用户实例传递到模板页面ljyEditUser.html中

注意,这个视图函数与我们之前写过的视图函数不同,因为它有两个参数,这里的第二个参数userID就是对应之前路由中定义的规则<int:userID>,所以用户编号会从url通过userID这个参数传递到视图函数getLjyUserByUserID,然后视图函数就可以根据这个用户编号去数据库中获取对应的用户对象了。这里我们获取用户数据使用了objects的get方法,注意这个方法如果没有获取到数据就会抛出异常,所以我们这里使用了try...except来捕获异常。get方法如果找到数据,那么会返回单个用户实例,这里就是与filter方法的不同之处了,因为filter方法无论如何都会返回一个列表,有数据时返回数据列表,没有数据时返回空列表。

当获取用户抛出异常时,我们使用HttpResponse来输出一串文字说明,使得对异常的响应比较友好。

第4步:将获得的用户数据传入到模板页面显示出来。

最后,我们再来新建一个html页面,用来显示当前要更新的数据,然后对数据进行编辑后,点击更新按钮对数据进行更新。

现在我们尝试点击编辑“雷佳音”这个用户,那么应该出现如下所示的页面预览效果。

现在我们对这个页面进行编写,我们使用ljyEditUser.html作为页面模板,模板的代码如下所示:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑用户【刘金玉编程案例】</title>
</head>
<body>
<h1>编辑用户</h1>
<form action="/saveuser/{{currentUser.userID}}/" method="post">
    {%csrf_token%}
    编号:<input type="text" name="userID" value="{{currentUser.userID}}" placeholder="用户编号"><br>
    账号:<input type="text" name="username" value="{{currentUser.username}}" placeholder="用户名"><br>
    密码:<input type="password" name="password" value="{{currentUser.password}}" placeholder="用户密码"><br>
    姓名:<input type="text" name="truename" value="{{currentUser.truename}}" placeholder="真实姓名"><br>

    {%if currentUser.sex == '男'%}
    性别:<input type="radio" value="男" name="sex[]" checked="checked">男 <input type="radio" value="女" name="sex[]">女 <br>
    {%else%}
    性别:<input type="radio" value="男" name="sex[]">男 <input type="radio" value="女" name="sex[]" checked="checked">女 <br>
    {%endif%}
    年龄:<input type="text" name="age" value="{{currentUser.age}}"><br>
    <br>
    <input type="submit" value="更新">
</form>
</body>
</html>

 

我们发现这个页面的代码与注册页面的代码极为相似,其实你没有看错,就是很相似,我也是复制过来后进行修改得到的,那么需要修改什么呢?

第一个要修改的就是form表单的提交目的地,我们这里使用如下url地址:/saveuser/{{currentUser.userID}}/进行处理提交的修改数据。

这个url中包含用户的编号userID,这个格式与我们的路由规则中保持一致。

模板控件中的文本和密码类型的,我们直接使用控件的value标签数据使得获得的用户数据填入,输出数据时与我们之前介绍的语法一样,使用{{变量}}的形式输出。

模板页里面的性别这个控件的显示相对复杂些,我们这里使用if语句进行了逻辑判断,我们通过输出的性别如果是‘男’时,就在‘男’的radio控件中加入被选中的标签属性checked="checked",否则就在‘女’的radio控件中加入checked="checked"。

这里我们最后总结一下模板中使用逻辑判断的if语句语法格式:

{%if 条件表达式%}

条件表达式为真时输出的html内容

{%else%}

条件表达式为假时要输出的html内容

{%endif%}

以后通过这种形式我们就可以判断某些html是否要输出显示了,在这个语句中,我们也可以省里{%else%},但是不能省略结束标签{%endif%}。

第5步:数据库保存更新数据。

当我们点击“编辑”页面上的“更新”按钮后,当前更新的数据会传递到表单对应的数据更新保存的路由,对应form标签的action属性的实际路由url是/saveuser/{{currentUser.userID}}/,

我们在路由规则同样加入保存用户的路由规则,如下图所示:

代码语言:javascript
复制
path('saveuser/<int:userID>/',views.updateLjyUserByUserID),

这个路由规则是不是和之前获取用户数据的路由规则非常相似?所以,这里不再详细赘述。我们来看看更加用户编号userID来更新用户信息的视图函数updateLjyUserByUserID吧。对应的updateLjyUserByUserID视图函数的代码如下所示:

代码语言:javascript
复制
#根据用户userID对数据进行更新
def updateLjyUserByUserID(request,userID):
    curuser=LjyUser.objects.get(userID=userID) #根据用户编号userID获取对应的用户数据
    curuser.username=request.POST['username'] #从编辑页面获取账号
    curuser.password=request.POST['password'] #从编辑页面获取密码
    curuser.truename=request.POST['truename'] #从编辑页面获取真实姓名
    curuser.sex=request.POST['sex[]'] #从编辑页面获取选择的性别
    curuser.age=request.POST['age'] #从编辑页面获取年龄
    curuser.save() #根据用户编号保存更新过的用户信息
    return HttpResponse('更新成功!<a href="/users/">返回用户列表</a>')  #页面提示更新成功信息

这个更新视图函数updateLjyUserByUserID也是类似于之前获取用户数据的视图函数getLjyUserByUserID,这两个函数都接收从url传入的userID这个参数,然后根据这个userID利用objects的get方法到数据库去获取用户数据。由于updateLjyUserByUserID这个视图函数默认是更新用户,之前已经根据用户编号userID已经获取过了一次用户,所以在这里就不再使用异常捕获功能了,我们默认为传入到用户编号肯定是存在的。最后将“编辑”页面通过form表单POST过来的所有数据利用request的POST字典接收并保存到查询出来的用户的相应的字段,最后通过save方法保存到数据库即可。

第6步:测试更新用户功能。

现在我们对“雷佳音”这个用户尝试进行部分数的修改,对账号改为“ljyy”,性别改为“女”,年龄改为12,如下图所示。

然后,我们点击“更新”按钮,发现“更新成功”的页面,如下图所示。

我们点击“返回用户列表”页以后,观察更新的数据是否生效,如下图所示。

我们发现数据更新生效成功!至此,我们已经能够开发用户信息的修改功能了。

下期老刘即将为大家介绍数据的删除,删除指定用户。通过刘金玉编程的教程,你会发现Django框架开发数据库变得越来越简单!加油哦!

本文字版教程作者刘金玉已在B站同步更新视频版,搜索“刘金玉编程”即可找到!

喜欢的朋友请支持转发朋友圈一起学习哦!

刘金玉编程,感谢您的支持!

【刘金玉编程Django框架教程Python课程实战系列书籍目录】

我的创作需要您的鼓励!喜欢的朋友请支持转发朋友圈一起学习哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程创造城市 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档