forms效验组件
可以帮我们快速的进行字段的判断
用法记忆
- from django import forms 导入模块
- class UserForm(forms.Form): 创建类 name=forms.CharField(min_length=4,lable='姓名')
- form = UserForm(request.POST) 实例化可以传递参数也可以不用传递参数
- form.is_valid() 校验字段
- form.cleaned_data 校验成功的字段
- form.errors 校验失败的字段
- form.name 模板中渲染input
- form.name.errors 模板中渲染当前字段的错误信息
- from django.forms import widgets 导入设置字段属性的模块
字段的属性设置
lable='姓名' 设置字段中文名 widgets = PasswordInput() 设置字段渲染type属性为password widgets = TextInput() 设置字段渲染type属性为text widgets = TextInput(attrs={"class":"form-contrl"}) 设置inpu标签的属性 error_messages = {'required':'该字段不能为空'} 配置显示的错误信息,key不能修改 error_messages = {'invalid':'格式错误'} 格式错误创建类
class UserForm(forms.Form): name=forms.CharField(min_length=4,lable='姓名') email = forms.EmailField(lable='邮箱')
froms组件的字段参数配置
- from django.forms import widgets 首先 导入模块
- name=forms.CharField(min_length=4,lable='姓名',widgets = PasswordInput)
- 字段属性的设置 widgets = PasswordInput() 设置字段渲染type属性为password widgets = TextInput() 设置字段渲染type属性为text widgets = TextInput(attrs={"class":"form-contrl"}) 设置inpu标签的属性 error_messages = {'required':'该字段不能为空'} 配置显示的错误信息,key不能修改 error_messages = {'invalid':'格式错误'} 格式错误
在视图函数中实例化
form = UserForm(request.POST) 实例化Form对象
校验方法
form.is_valid() #校验提交的字段是否符合信息,返回布尔值
- 如果 form.is_valid() 为True form.cleaned_data 返回值是字典,所有的效验成功的字段,和字段值,
- 如果form.is_valid() 为False form.errors 返回的是字典,所有校验失败的字段,和字段值,form.cleaned_data 返回值是字典,所有的效验成功的字段,和字段值,
- form.cleaned_data 所有的效验成功的字段,和字段值
form.errors 返回的是字典,所有校验失败的字段,和字段值,form.cleaned_data 返回值是字典,所有的效验成功的字段,和字段值,
在模板中渲染form
- form = UserForm() 首先实例化form对象,不传递参数
- 把变量出入模板中
- 可以form.name进行input的标签渲染,或者进行for循环渲染,在或者{ {from.as_p}} { {from.as_ul}} 把所有字段渲染出来 _p ,_ul 这个代表渲染出来的标签
进行渲染时可以取出lable属性 如 form.name.lable
渲染错误信息
- form = UserForm(request.POST)当有参数实例化时 在模板中渲染会把你传进来的值,渲染进去
- form.name.errors 存放的是当前字段错误信息的列表,这里是name字段信息的错误列表
- form.name.errors.0 取出错误信息
自定义forms组件校验规则
from django.core.exceptions import ValidationErrorclass UserForm(forms.Form): name=forms.CharField(min_length=4,lable='姓名') email = forms.EmailField(lable='邮箱') # 局部钩子 def clean_name(self): val=self.cleaned_data.get("name") if not val.isdigit(): return val else: raise ValidationError("用户名不能是纯数字!") # 全局钩子 def clean(self): pwd=self.cleaned_data.get("pwd") r_pwd=self.cleaned_data.get("r_pwd") if pwd and r_pwd: if pwd==r_pwd: return self.cleaned_data else: raise ValidationError('两次密码不一致!') else: return self.cleaned_data def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 所有干净的字段以及对应的值 else: clean_error=form.errors.get('__all__') return render(request,"register.html",locals()) form=UserForm() return render(request,"register.html",locals())
注意
- 使用局部钩子时用一定要用 clean_开头 加字段名去命名 如clean_name
- 全局错误信息会放到form.errors字段 __all__对应的值中