day22-django form验证

一、引子

  之前我们学习,前端往后台发送数据,通过form ,ajax 提交,后台验证用户名密码是否正确,正确就跳转。那么假设注册的时候,form 就需要提交一些其它信息,用户名,密码,邮箱,电话等个人信息。后台拿到这些数据的时候,就需要对这些注册的数据进行验证,是否符合格式要求,用户名长度,唯一性,密码的长度等等。。。可以自己写正则表达式进行验证,很麻烦。django给我们提供了一个便利的工具,form 验证。

二、Form验证

 2.1 、小搞一把

  views  

#############form 验证#####
from django import forms

class FM(forms.Form):
#获取只关心的数据
# user,pwd,email 对应前端的 name属性
user=forms.CharField(error_messages={"required":"用户名不能为空",}) #自定义错误信息
#因为定义了密码长度,所以错误信息里,可以直接用 max_length,min_length
pwd=forms.CharField(max_length=16,min_length=8,error_messages={"required":"密码不能为空","max_length":"密码长度不能大于16"
,"min_length":"密码长度不能小于6"})
email=forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})

def fm(request):
if request.method=="POST":
#获取用户所有数据
#每条数据验证
#成功,获取正确的信息,
#失败,显示错误信息
obj=FM(request.POST) #获取数据
res=obj.is_valid()#验证是否成功
if res:
print(obj.cleaned_data) #字典格式,直接传给,models 添加到数据库中
models.User.objects.create(**obj.cleaned_data)
return HttpResponse("ok")
else:
#obj.errors 是继承了dict ,所以它是一个字典,obj.errors["user"]
#所以前端,error.errors.user/pwd/email
print(obj.errors,type(obj.errors))
return render(request,"fm.html",{"obj":obj})

elif request.method=="GET":
obj=FM()
#这里obj 名字与post 方法的名称一致,在前端中使用。
return render(request,"fm.html",{"obj":obj})

    html

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <!--
 9     <form action="/fm/" method="post">
10         {% csrf_token %}
11         <p><input type="text" name="user">{{ error.errors.user }}</p>
12         <p><input type="text" name="pwd">{{ error.errors.pwd }}</p>
13         <p><input type="text" name="email">{{ error.errors.email }}</p>
14         <p></p>
15         <input type="submit" value="TJ">
16         <input type="button" value="cancel">
17     </form>
18 -->
19 
20     自定制 FM
21     <form action="/fm/" method="post">
22         {% csrf_token %}
23         <p>{{ obj.user }}{{ obj.errors.user.0 }}</p>
24         <p>{{ obj.pwd }}{{ error.errors.pwd.0 }}</p>
25         <p>{{ obj.email }}{{ error.errors.email.0 }}</p>
26         <p></p>
27         <input type="submit" value="TJ">
28         <input type="button" value="cancel">
29     </form>
30 </body>
31 </html>

  结果

  补充:

 

  1、自动创建标签

1
2
#这边自动创建标签,这边是根据你的FM类中的widget=widgets.插件名,来定制的,默认是input框
{{ obj.user }}

  2、返回错误信息

1
2
#这边获取用户标签的第0个错误信息,因为错误信息可能有很多个,我们只需要拿第0个
{{ obj.errors.user.0 }}

 

三、下面我们看看另外三个牛逼的自动生成HTML

  

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <!--
 9     <form action="/fm/" method="post">
10         {% csrf_token %}
11         <p><input type="text" name="user">{{ error.errors.user }}</p>
12         <p><input type="text" name="pwd">{{ error.errors.pwd }}</p>
13         <p><input type="text" name="email">{{ error.errors.email }}</p>
14         <p></p>
15         <input type="submit" value="TJ">
16         <input type="button" value="cancel">
17     </form>
18 -->
19 
20     自定制 FM
21     <form action="/fm/" method="post">
22         {% csrf_token %}
23         <p>{{ obj.user }}{{ obj.errors.user.0 }}</p>
24         <p>{{ obj.pwd }}{{ error.errors.pwd.0 }}</p>
25         <p>{{ obj.email }}{{ error.errors.email.0 }}</p>
26         <p></p>
27         <input type="submit" value="TJ">
28         <input type="button" value="cancel">
29 
30     </form>
31  <hr>
32     obj.as_p
33 
34      <form action="/fm/" method="post">
35         {% csrf_token %}
36         {{ obj.as_p }}
37         <input type="submit" value="TJ">
38         <input type="button" value="cancel">
39     </form>
40 
41 
42  <hr>
43 
44 obj.as_ul
45 
46      <form action="/fm/" method="post">
47         {% csrf_token %}
48         {{ obj.as_ul }}
49         <input type="submit" value="TJ">
50         <input type="button" value="cancel">
51     </form>
52 
53 <hr>
54 
55 obj.as_table 需要自己添加 table 标签
56 
57      <form action="/fm/" method="post">
58         {% csrf_token %}
59          <table>
60             {{ obj.as_p }}
61          </table>
62         <input type="submit" value="TJ">
63         <input type="button" value="cancel">
64     </form>
65 
66 </body>
67 </html>

 

by the way:其他需要注意的是:我们应该自己在app中创建一个forms.py文件,来专门存放forms验证的代码:

 

posted @ 2018-07-24 14:56  东郭仔  阅读(121)  评论(0)    收藏  举报