服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息
form组件的3大功能:
1 验证(显示错误信息)
2 保留用户上次输入的信息
3 可以生成html标签
class A_Form(Form):
字段=fields.字段类型(默认参数:required=True,widget=widgets.插件(attrs={}))
常用字段:Charfield,RegexField,IntegerField,EmailField
常用参数:max_length,min_length,
widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))
error_messages={
'required':'用户名不能为空',
'max_length':'太长了',
'min_length':'太短了',
}
label='用户名', # obj.t1.label
disabled=False, # 是否可以编辑
label_suffix='--->', # Label内容后缀
help_text='。。。。。。', # 提供帮助信息
obj=A_Form(initial='')#生成空的html标签,含有默认值
obj=A-Form(request.POST)#拿到浏览器请求,传入form做验证
obj.is_valid()#判断验证是否通过
obj.cleaned_data()#验证通过后的值 字典形式
obj.errors #form 返回的错误信息 是个对象 'obj.errors.字典.0 ' 获取第一个错误信息
1.obj=Form()form组件类实例化时找到类中所有的字段 把这些字段 变成组合成字典;
self.fields={‘user’:正则表达式1,‘pwd’:正则表达式2}
2.循环self.fields字典(自己写的字段)
for k,v in self.fields.items():
K是user,pwd
v是正则表达式
3.每次循环通过self.fields字典的键, 一个一个的去get前端POST提交的数据 得到用户输入数据;
input_value= request.post.get(‘k’)(所以form字段的名称,要和前端的name属性匹配)
4.每次拿到用户输入的数据 (input_value)和进行正则表达式匹配;
5.匹配成功flag=True 匹配失败flag=false,最后 return flag obj.is_valid=flag。
如果For自带的规则和正则满足不了验证需求,可在Form类中自定义方法,做扩展。
6.每个字段验证通过后,每个字段执执行self.clean_filelds函数(自定义 对Form类中的字段做单独验证,比如去数据库查询判断一下用户提交的数据是否存在?)
- 执行Form组件的clean_form方法进行整体验证!(既然每个字段都验证了,就可以对用户提交的数据做整体验证了!比如进行联合唯一的验证)
8.最后执行类似 clean_form的post_clean方法结束验证。(一般不使用post_clean做自定义过滤,clean_form方法完全可以解决)
form表单验证:
from django.shortcuts import render,HttpResponse,redirect
from django.forms import Form
from django.forms import fields
class Login(Form):
#from验证规则 用户名 6-10字符 required不能为空
name=fields.CharField(max_length=10,
min_length=6,
required=True,
error_messages={
'required':'用户名不能为空', #error_messages参数 自定义错误信息
'min_length':'太短了',
'max_length': "太长了",
}
)
# z注意name 必须和 from表单提交的一致,要么二则怎么对比校验呢
pwd= fields.CharField(min_length=3,
required=True,
error_messages={
'required': '密码不能为空', # error_messages参数 自定义错误信息
'min_length': '太短了',
'max_length': "太长了",
}
)
def index(request):
if request.method=='GET':
return render(request,'login.html')
else:
obj=Login(request.POST) #把客户端提交来的form表单和 和匹配规则放在一起
res=obj.is_valid() #自动校验 给出结果 True 或者 False
if res: #验证成功后obj.cleaned_data获取成功的数据,字典类型正好对应数据 的批量操作
print(obj.cleaned_data)
return redirect('http://www.baidu.com')
else:
return render(request,'login.htm