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 ValidationError
class 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__对应的值中