一. form表单验证
form可以生成html标签,可以校验,可以保留上次输入内容
1. 创建form表单
from django import forms class MyForm(forms.Form): username = forms.CharField( label = "用户名", # min_length = 6, validators=[] , # 校验器 widget=forms.TextInput(attrs={}) , # 小插件 ) 常用的form字段 CharField() ChoiceField() 常用的内置字段 label 用于生成label标签或者显示内容 required=True 是否可以为空 error_messages={} 错误信息{"required":"不能为空"} widget 小插件 help_text="" 帮助信息 validators=[] 校验器,可以使用Regexvalidator() from djang.core.validators impor Regexvalidator 还可以自定义校验器 initial=xxx 默认值 strip=True 移除两端空白 choices=((1,"男")) 选项 插件中常用的种类 PasswordInput 密码框 Select() 单选下拉框 RadioSelect() 单选按钮 读取数据库中内容,作为选项 name = ModelMultipleChoiceField( queryset = models.userinfo.objects.all() )
2. 在view中的方法
from_obj = MyForm() 创建对象,用来渲染页面
form_obj = MyForm(request.POST) 把post提交的数据进行校验
form_obj.is_valid() 判断是否校验成功
form_obj.cleaned_data 在is_valid()之后使用,获取所有校验完的数据
form_obj.error.as_data 获取错误信息字典形式的对象
form_obj.add_error("字段","错误信息") 给某个字段添加错误信息
form_obj.fields 存有字段的有序字典
二. RegexValidator校验器
校验器一般是根据正则来校验是否符合
1. RegexValidator校验器
from django.core.validators import RegexValidator
validators = [RegexValidator(r"正则","错误信息")...]
2. 自定义校验器
import re from django.core.exceptions import ValidationError def my_validator(value): reg = re.compile(r"正则") if not reg.match(value): raise ValidationError("错误信息") validators = [my_validator,...]
三. hook钩子
在创建的form字段类中加hook钩子
1. 局部钩子
def clean_字段(self): value = self.cleaned_data.get("字段") if 验证value条件: raise ValidationError("错误信息") # 错误时 else: return value # 成功时要返回value
2. 全局钩子
def clean(self): value = self.cleaned_data.get("字段") if 校验条件: self.add_error("字段","错误信息") #给某个字段添加错误 # raise ValidationError("错误信息") # 给全局添加错误 else: return cleaned_data # 返回全部信息
四. 校验顺序
1. 个人猜测版
字段校验 => 验证器=> 局部钩子 => 全局钩子
2. 网上搜索版
先来归纳一下整个流程
(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase
(2)接着分析errors.里面判断_errors是都为空,如果为空返回self.full_clean(),否则返回self._errors
(3)现在就要看full_clean(),是何方神圣了,里面设置_errors和cleaned_data这两个字典,一个存错误字段,一个存储正确字段。
(4)在full_clean最后有一句self._clean_fields(),表示校验字段
(5)在_clean_fields函数中开始循环校验每个字段,真正校验字段的是field.clean(value),怎么校验的不管
(6)在_clean_fields中可以看到,会将字段分别添加到_errors和cleaned_data这两个字典中
(7)结尾部分还设置了钩子,找clean_XX形式的,有就执行。执行错误信息也会添加到_errors中
(8)整个校验过程完成