FORM组件
form组件
功能:
生成页面可用的HTML标签
对用户提交的数据进行校验
保留上次输入的内容
注册功能
## view视图 from django import forms # 定义一个类 继承django中的封装好的form组件的功能 class RegForm(forms.Form): user = forms.CharField(label="用户名") # label 中文标签 pwd = forms.CharField(label="密码") def reg(request): form_obj = RegForm() # 实例化对象 if request.method == 'POST': form_obj = RegForm(request.POST) # 将post提交的数据传给对象 if form_obj.is_valid(): # is_valid 数据校验是否成功,返回布尔值 return HttpResponse('注册成功') return render(request, 'reg.html', {'form_obj': form_obj})
<body> <form action="" method="post" novalidate> {# novalidate 告诉前端不用进行校验,传到服务器进行校验,显示服务器的errors信息 #} {% csrf_token %} <p> <label for="{{ form_obj.user.id_for_label }}">{{ form_obj.user.label }}</label>: // id_for_label 与input框的id相同 label是view视图中user的参数 {{ form_obj.user }} {{ form_obj.user.errors.0 }} {# 自动生成输入框 后面是错误提示信息 #} </p> <p> <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>: {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }} </p> {{ form_obj.errors }} {# 显示全部的错误信息 #} <button>注册</button> </form> </body>
字段
CharField 文本
ChoiceField 选择框
MultipleChoiceField 多选框
EmailField 邮箱
IntegerField 数字
FileField 文件
参数
min_length 最小长度 max_length 最大长度 required=True, 是否允许为空 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 默认值 error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'} validators=[], 自定义验证规则 在括号内写函数名称,另外另一函数进行校验 disabled=False, 是否可以编辑 widget HTML插件
widget=forms.widgets.PasswordInput # 密文 用于密码 widget=forms.widgets.RadioSelect # 单选 要有choices参数 widget=forms.widgets.SelectMultiple # 下拉框多选 widget=forms.widgets.CheckboxInput # 多选
校验
内置校验
在字段内设置的参数就是校验的条件 比如最大长度,最小长度,是否必填等
自定义校验
##1.写函数 from django.core.exceptions import ValidationError def check(value): # 指定校验器的值会传给value # 通过校验 不用返回 # 没有通过校验 抛出异常 if value == 'alex': raise ValidationError('有非法字符') ## 2.内置校验器 from django.core.validators import RegexValidator # 正则校验 phone = forms.CharField( validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确')] #通过正则式匹配手机号,不匹配抛出异常信息
is_valid()流程
-
-
full_clean方法():
-
定义一个存放错误信息的字典 self._errors = ErrorDict()
-
定义一个存放正确(经过校验)值 的字典 self.cleaned_data = {}
-
执行self._clean_fields():
-
依次循环所有的字段
-
执行内部的校验 和 自定义校验器的校验 value = field.clean(value)
-
将正确的值放在self.cleaned_data self.cleaned_data[name] = value
-
有局部钩子就执行
-
通过校验 self.cleaned_data[name] 重新赋值
-
不通过校验 self.cleaned_data[name] 当前字段的键值对被清除 self._errors中存放当前字段的错误信息
-
-
-
执行self._clean_form() ——》 self.clean()
-
如果有重新定义就执行
-
通过校验 返回所有的值 self.cleaned_data 重新赋值
-
不通过校验 把错误信息添加到 all 中
-
-
-
局部钩子和全局钩子
def clean_user(self): # 局部钩子 针对于user value = self.cleaned_data.get('user') # 通过校验规则 返回正确的值 (可以修改返回值) return "{}dsb".format(value) # 不通过校验规则 抛出异常 raise ValidationError('错误提示') def clean(self): # 全局钩子 pwd = self.cleaned_data.get('pwd') re_pwd = self.cleaned_data.get('re_pwd') # 通过校验规则 返回正确的值(所有的值 self.cleaned_data ) (可以修改返回值) if pwd == re_pwd: return self.cleaned_data # 不通过校验规则 抛出异常 raise ValidationError('两次密码不一致')
取全局钩子抛出的错:
前端获取: {{ 实例.non_field_errors.0 }}