主要功能
1.渲染html代码
2.校验数据
3.展示提示信息
校验数据,前端可有可无,但是后端必须要有
基本语法
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={
'min_length':'用户名最少3位',
'max_length':'用户名最大8位',
'required':'用户名不能为空'
})
password = forms.CharField(min_length=3,max_length=8)
email = forms.EmailField(
error_message={
'invalid':'邮箱格式不正确',
'required':'邮箱不能为空'
}
)
校验数据
# 1.将待校验的数据组织成字典的形式传入即可
form_obj = MyForm({'username':'jason'})
form_obj.is_valid() ## 布尔值,只有在所有数据全部合法的情况下才会返回true
form_obj.cleaned_data ## 查看所有符合条件的数据
form_obj.errors ## {'字段名':['出错信息']}
# 2.校验数据只校验类中出现的字段,多传不影响校验,不会校验多传的
# 3.少传不行
渲染标签
def index(request):
form_obj = MyForm()
return render(request,'',locals())
# 前端
## 第一种渲染方式:代码书写极少,封装程度太高,不变扩展,测试使用
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
{{ form_obj.as_table }}
## 第二种渲染方式:可扩展性非常强,但是要书写的代码太多,一般不用
{{ form_obj.username.label }}:{{ form_obj.username }}
## 第三种渲染方式:推荐使用
{% for form in form_obj %}
{{ form.label }}:{{ form }}
<span>{{ form.errors }}</span>
{% endfor %}
展示提示信息
# 后端获取用户数据
form_obj = MyForm() # 先产生一个空对象
if request.method == 'POST':
# 如何批量获取数据,并构造成字典的格式,传入校验呢?
form_obj = MyForm(request.POST)
# 判断数据是否合法
if form_obj.is_valid():
# 操作数据库,存储数据
models.User.objects.create()
else:
# 获取错误信息,展示到前端
form_obj
"""
浏览器会自动帮你校验数据,但是前端的校验若弱不禁风
如何让浏览器不做校验
给form表单加一个novaludata
"""
{% for form in form_obj %}
{{ form.label }}:{{ form }}
<span>{{ form.errors.0 }}</span> # 一定要点0,取值,不然会渲染成ul+li的形式
{% endfor %}
"""
1.必备的条件,get请求和post请求传给html页面对象的变量名必须一样
2.forms组件当你的数据不合法的情况下,会保存你上次书写的数据,让你基于之前的数据进行修改
"""
钩子函数
"""
在特定的节点自动触发完成相应操作
钩子函数在forms组件中就类似于第二道关卡,能够让我们自定义校验规则
在forms组件中有两类钩子
1.全局钩子
当你需要给多个字段增加校验规则的时候可以使用
2.局部钩子
当你需要给单个字段增加校验规则的时候可以使用
"""
# 实际案例
# 1.校验用户名中不能含有666 局部
# 2.校验密码和确认密码是否一直
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={
'min_length':'用户名最少3位',
'max_length':'用户名最大8位',
'required':'用户名不能为空'
})
password = forms.CharField(min_length=3,max_length=8)
confirm_password = forms.CharField(min_length=3,max_length=8)
email = forms.EmailField(
error_messages={
'invalid':'邮箱格式不正确',
'required':'邮箱不能为空'
}
) # email字段必须符合邮箱格式
# 钩子函数
# 局部
def clean_username(self):
# 获取到用户名
username = self.clean_data.get('username')
if '666' in username:
# 提示报错信息
self.add_error('username','666是不行的~')
# 将钩子函数勾出来的数据在放回去
return username
# 全局
def clean(self):
password = self.clean_data.get('password')
confirm_password = self.clean_data.get('confirm_password')
if not confirm_password == password:
self.add('confirm_password','两次密码不一致')
return self.clean_data
label:字段名
error_messages:自定义报错信息,字典
initial:默认值
required:是否必填
"""
字段没有样式
针对不同类型的input如何修改
"""
widget = forms.widgets.TextInput(attrs={'class':'form-control'}) # 可以修改input框类型,text;括号内可以添加标签属性,通过字典方式
widget = forms.widgets.PassInput(attrs={'calss':'form-control c1'}) # input
# 第一道关卡正则验证
phone = forms.CharField(
validators = [
RegexValidator(r'^[0-9]+$','请输入数字')
]
)