Django快速入门 (4)-- 学会处理表单数据
表单在web框架中是前端非常重要的HTML组件,主要以<form>标记开头,</form>结尾。中间使用包括输入框、单选框、多选框、下拉选择框、submit按钮、reset按钮等多种UI元素,如下示例:
<form method = "post" action="url">
<input type="text" name="name1">
<input type="submit">
</form>
form具有method和action两种属性,method为表单提交的方式,包括post和get,action一般为表单提交的目标url,也就是由指定的url来处理表单提交的内容。
那如果form组合中输入框较多,如何确定每个输入框所输入的值呢?通常会对input类型的组件给定一个name名称属性,这样提交时在处理表单URL文件里通过name属性来获取该input类型的值。
好了,我就这样简单的将form表单的一个概要过程介绍了一下。如果你对表单还不太熟悉,请先百度查询表单相关详细文档。不过我觉得都已经在学习django框架了,这方面应该已经有了些经验,那我前面的内容就纯碎是抛砖引玉了。
言归正传,下面我们来看看django如何处理表单提交的输入,学会将表单输入存储到数据库,然后使用该信息。
入门1:构造表单内容
因为是测试性质,所以不会那么严格。这话是用来描述构造表单的位置。这里我在之前的book业务模块里的首页构造一个表单,同时该表单内容将会被提交到book user表中。所以表单元素的组成与book_ user表结构需要一致,包括name,sex,age,salary四个属性。
基本思路是:表单填写信息 --- 提交 -- 提交给book/user(views视图里的user函数处理)
我们先来看表单内容:
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>book page</title>
<link rel="stylesheet" href="static/css/index.css">
</head>
<div class="header">
<li>大数据Data</li>
<li>旅行Travel</li>
<li><a href="book">文章Book</a></li>
<section>
<p>这是文章页面</p>
<p>测试一下表单提交</p>
<form action="book/user" method="post">
name: <input type="text" name="username"> <br>
sex: boy <input type="radio" name="sex" value="male">
girl <input type="radio" name="sex" value="female"> <br>
age: <input type="text" name="age"> <br>
salary: <input type="text" name="salary"> <br>
<input type="submit" value="提交">
</form>
<p><a href="/"> 回首页</a></p>
</section>
<div class="footer">
<li>made by Cao Jianhua</li>
</body>
</html>
在浏览器上预览效果如下:
入门2:接收处理表单内容,然后存入数据库
接下来的事情就交给book模块的views视图来做,views视图里新建一个user方法,接收表单的信息:
def user(request):
if request.method == 'POST':
print(request.POST)
此时可以测试一下在前面网页端提交一个记录,点击提交按钮后,在pycharm终端就会打印出来刚才提交的信息:
<QueryDict: {'username': ['2121'], 'sex': ['male'], 'age': ['11'], 'salary': ['11']}>
我们看到request.POST是一个字典,其key为前面表单中的各元素的name属性,value为输入的值。
有数据之后再存入数据库就比较简单了,可以直接调用上一篇博文里开发的book子模块的dbTools.py函数,我们可以再看一下代码:
from django.http import HttpResponse
from .models import User
# 数据库存入操作
def insert(request,**dic):
flag = 0
# 通过objects这个模型管理器的create()插入数据,参数为字典形式
obj1 = User.objects.create(**dic)
flag = 1
except Exception as e:
return flag
#数据库查询操作
def query(request):
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = User.objects.all()
res = [item for item in list.values()]
return res
#数据库更新操作
def update(request):
# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
flag = 0
obj1 = User.objects.get(id=1)
obj1.name = 'Google'
obj1.save()
flag = 1
# 另外一种方式
# Test.objects.filter(id=1).update(name='Google')
# 修改所有的列
# Test.objects.all().update(name='Google')
except Exception as e:
return flag
#删除操作
def delete(request):
flag = 0
# 删除id=1的数据
obj1 = User.objects.get(id=1)
obj1.delete()
flag = 1
# 另外一种方式
# Test.objects.filter(id=1).delete()
# 删除所有数据
# Test.objects.all().delete()
except Exception as e:
return flag
包括了查询、修改、插入和删除四种处理方式,不过在django里使用的是orm方式来操作数据库,不需要组装SQL语句。
下面就使用insert方法来存入数据库book_user表中,此时修改一下views视图文件里的user函数:
def user(request):
msg={}
if request.method == 'POST':
dic = request.POST
info = { "name": dic['name'],
"sex": dic['sex'],
"age": int(dic['age']),
"salary":float(dic['salary'])
if dbTools.insert(request,info):
msg['info']= dbTools.query(request)
return render(request,'book/user.html',msg)
else:
msg['info']='error'
return render(request,'book/user.html',msg)
在user函数里我们添加了一个book模块的user.html,此时回到templates目录book文件夹下新建一个名为user.html文件。在里面输入如下内容,主要就是打印info的内容:
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>UserInfo</title>
</head>