Django快速入门 (4)-- 学会处理表单数据

Django快速入门 (4)-- 学会处理表单数据

3 年前 · 来自专栏 稻谷团python人工智能

表单在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>