### 11.12 form组件 form组件的功能: 1. 生产input标签 2. 对提交的数据进行校验 3. 提供错误提示 定义form组件 ```python from django import forms class RegForm(forms.Form): username = forms.CharField() pwd = forms.CharField() ``` 使用的流程 视图 ```python form_obj = RegForm() form_obj = RegForm(request.POST) form_obj.is_valid(): #对数据进行校验 print(form_obj.cleaned_data) #通过检验的数据 return render(request,'regs.html',{'form_obj':form_obj}) ``` 模板 ```html {{form_obj.as_p}} ----> 生产一个个p标签 input label {{form_obj.errors}} ----->form表单中所有字节的错误 {{form_obj.username}} ----->一个字段对应的input框 {{form_obj.username.label}} ---》该字段的中文提示 {{form_obj.username.id_for_label}} ----->该字段的input框的id {{form_obj.username.errors}} ---->给字段的所有错误 {{form_obj.username.errors.0}} ---->该字段的第一个错误 ``` 常用字段 ```python CharField ChoiceField MultipleChoiceField ``` 字段参数 ```python required=True 是否允许为空 widget=None html插件 label=None 用于生成label的标签或者显示内容 initial = None 初始值 error_message=None 错误信息 {'required':'不能为空','invalid':'格式错误'} validators=[函数名] 自定义验证规则 disabled=False 是否可以编辑 ``` 验证 1.内置验证 ```python required=True min_length max_length ``` 2.自定义校验器: 1.写函数 ```python def checkname(value): #通过校验规则 不做任何操作 #不通过校验规则 抛出异常 if 'liujia' in value: raise ValidationError('不合格我的想法') ``` 2.使用内置的检器 ```python from django.core.validators import RegexValidator ``` 3.钩子函数 1.局部钩子 ```python def clean_字段名(self): # 局部钩子 # 通过校验规则 必须返回当前字段的值 # 不通过校验规则 抛出异常 raise ValidationError('不符合社会主义核心价值观') ``` 2.全局钩子 ```python def clean(self): # 全局钩子 # 通过校验规则 必须返回当前所有字段的值 # 不通过校验规则 抛出异常 '__all__' pass ``` is_valid的流程: 1.执行full_clean()的方法: 定义错误字典 定义存放清洗数据的字典 2.执行_clean_fields方法: 循环所有的字段 获取当前的值 对进行校验 ( 内置校验规则 自定义校验器) 1. 通过校验 self.cleaned_data[name] = value 如果有局部钩子,执行进行校验: 通过校验——》 self.cleaned_data[name] = value 不通过校验——》 self._errors 添加当前字段的错误 并且 self.cleaned_data中当前字段的值删除掉 2. 没有通过校验 self._errors 添加当前字段的错误 3.执行全局钩子clean方法