Django Form组件
Django Form组件
form组件
-
form表单完成的事情
-
自动写input框
-
对提交的数据进行校验
-
提供错误提示
-
定义form组件
from django import forms
class RegForm(forms.Form):
username = forms.CharField(label='用户名')
pwd = forms.CharField(label='密码')
- 使用
视图中:
form_obj = RegForm() # 实例化form对象
return render(request, 'register.html', {'form_obj': form_obj})
模板中:
form 标签加上novalidate 前端不进行校验
{{ form_obj.as_p }} ——》 生成所有的p标签 label input
{{ form_obj.errors }} ——》所有字段的错误
{{ form_obj.user }} ——》 该字段的input框
{{ form_obj.user.label }} ——》 该字段的label 中文提示
{{ form_obj.user.id_for_label }} ——》 该字段的id
{{ form_obj.user.errors }} ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息
字段和参数
常用的字段
CharField input
ChoiceField select框
MultipleChoiceField 多选框
常用插件
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
forms.widgets.PasswordInput 密码框
forms.widgets.RadioSelect radio单选
forms.widgets.Select select单选
forms.widgets.SelectMultiple select多选
forms.widgets.CheckboxInput check单选
forms.widgets.CheckboxSelectMultiple check多选
字段的参数:
required=True, 是否允许为空
widget=None, HTML插件
label=None, 用于生成Label标签或显示内容
initial=None, 初始值
error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
validators=[], 自定义验证规则
disabled=False, 是否可以编辑
示例代码
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
def check(value):
if 'aa' in value:
raise ValidationError('敏感词汇!!')
# return value
class MyForm(forms.Form):
username = forms.CharField(
label='用户名',
min_length=8,
initial='张三',
required=True,
# disabled=True,
# validators=[check, ],
error_messages={
'required': '不能为空',
'invalid': '格式错误',
'min_length': '最短8位'
}
)
pwd = forms.CharField(
label='密码',
widget=forms.PasswordInput()
)
re_pwd = forms.CharField(
label='确认密码',
widget=forms.PasswordInput()
)
phone = forms.CharField(
label='手机号',
required=True,
validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确!')]
)
gender = forms.fields.ChoiceField(
choices=((1, '男'), (2, '女'), (3, '保密')),
label='性别',
initial=1,
widget=forms.widgets.RadioSelect()
)
hobby = forms.fields.MultipleChoiceField(
choices=((1, '吃'), (2, '玩'), (3, '睡')),
label='爱好',
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
def clean_username(self):
value = self.cleaned_data.get('username')
if 'bb' in value:
raise ValidationError('敏感词汇!!!!')
return value
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd != re_pwd:
self.add_error('re_pwd', '两次密码不一致!')
raise ValidationError('两次密码输入不一致')
return self.cleaned_data
校验
校验流程
0. 校验开始 form_obj.is_valid()
- 内置校验,self.validate(value)
- 自定义校验,self.run_validators(value)
- 局部钩子校验,if hasattr(self, 'clean_%s' % name):
- 全局钩子校验,self._clean_form() -》 self.clean()
- 获取数据,form_obj.cleaned_data
内置校验
校验 required=True,min_length=8,max_length=12,
源码示例:
def validate(self, value):
if value in self.empty_values and self.required:
raise ValidationError(self.error_messages['required'], code='required')
自定义校验(自定义校验器)
第一种
from django.core.exceptions import ValidationError
def check(value):
if 'aa' in value:
raise ValidationError('敏感词汇!!')
# return value
validators=[check]
第二种
from django.core.validators import RegexValidator
validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确!')]
局部钩子
定义一个方法 clean_字段名(self,)的方法,如果不通过校验规则,要抛出异常ValidationError,如果通过校验规则,返回通过校验的值
用于校验单个字段
def clean_username(self):
value = self.cleaned_data.get('username')
if 'bb' in value:
raise ValidationError('敏感词汇!!!!')
return value
全局钩子
定义一个方法 clean(self)的方法,如果不通过校验规则,要抛出异常ValidationError,还可以自己使用self.add_error('re_pwd', '两次密码不一致!')添加错误信息。如果通过校验规则,返回所有通过校验的值
用于校验多个字段或联合字段
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd != re_pwd:
self.add_error('re_pwd', '两次密码不一致!')
raise ValidationError('两次密码输入不一致')
return self.cleaned_data