### 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方法