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验证的代码:

浙公网安备 33010602011771号