基本用法
from django import forms# 自己写一个类
class RegForm(forms.Form):username= forms.CharField(min_length=3,max_length=8, label="用户名")password = forms.CharField(min_length=3,max_length=8,label="密码")email=forms.EmailField()
1.校验数据为字典形式。
2.is_valid():全部数据通过才true;
3. cleaned_data:查看符合校验的数据
4.errors:查看不符合校验的数据,以及不符合原因。
5.多传字段直接忽略。
6.少传错误,默认所有字段必须传值。
渲染标签
forms组件只帮你渲染获取用户输入(输入 选择 下拉 文件)的标签 不渲染按钮和form表单标签
 渲染出来的每一个input提示信息都是类中字段首字母大写
class MyRegForm(forms.Form):username = forms.CharField(max_length=8, min_length=3,label='用户名')  # 最长8位,最短3位password = forms.CharField(max_length=8, min_length=3)  # 最长8位,最短3位email = forms.EmailField()  # 邮箱验证def reg(request):# 1 先生成一个空的类对象form_obj = MyRegForm()if request.method == 'POST':# 3 获取用户数据并交给forms组件校验  request.POSTform_obj = MyRegForm(request.POST)  #*****全部数据# 4 获取校验结果if form_obj.is_valid():return HttpResponse('数据没问题')else:# 5 获取校验失败的字段和提示信息print(form_obj.errors)# 2 直接将该对象传给前端页面return render(request, 'reg.html', locals())第一种
<body>
<p>第一种渲染方式:多个p标签  本地测试方便 封装程度太高了 不便于扩展</p>
{{ form_obj.as_p }}
{#{{ form_obj.as_ul }}#}
{#{{ form_obj.as_table }}#}
</body>第二种
<p>第二种渲染方式:  扩展性较高 书写较为繁琐</p>
<label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
{{ form_obj.username }}
{{ form_obj.password.label }}{{ form_obj.password }}
{{ form_obj.email.label }}{{ form_obj.email }}第三种
推荐使用,for循环方式。也可以用ajax
{{ form.errors.0 }} # 这个是模板语法
<p>第三种渲染方式  推荐使用</p>
<form action="" method="post" novalidate>{% for form in form_obj %}<p>{{ form.label }}{{ form }}<span>{{ form.errors.0 }}</span></p>{% endfor %}<input type="submit">
</form>数据校验
数据校验一个前后端都得有 但是前端的校验弱不禁风 可有可无
 而后端的校验则必须非常全面
form表单取消前端浏览器自动校验功能 <form action="" method="post" novalidate>notes:
1.必备条件,get请求和post传给html页面对象变量名必须一致。(form_obj)
2,当不合法的时候,也会保存上次数据,方便修改。
CharField用户名类型校验
from django.forms import widgets   //不导入也可以,没提示class MyRegForm(forms.Form):# 用户名最少3位最多8位username = forms.CharField(max_length=8,min_length=3,label='用户名',error_messages={     //报错信息的提示'max_length':"用户名最长8位",'min_length':"用户名最短3位",'required':"用户名不能为空"},required=False,initial='jeff',  // 为空和默认值widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2'}),		//设置input的type属性为text,及class属性)email = forms.EmailField(label='邮箱',error_messages={'required':'邮箱必填','invalid':'邮箱格式不正确'})
钩子函数
 局部钩子:操作单个字段的数据
全局钩子:操作多个字段的数据
钩子勾回来处理完之后,还要还回去的
局部钩子
校验用户名中不能包含666
# 局部钩子
# 这里的self是自己类,MyRegFormdef clean_username(self):username = self.cleaned_data.get('username')if '666' in username:self.add_error('username','光喊666是不行的')  	//添加报错信息return username										//再把数据返回去
全局钩子
前面验证通过才走钩子函数验证。一层一层的验证
两次密码验证-----两个字段
class MyRegForm(forms.Form):# 密码password = forms.CharField(max_length=8,min_length=3,label='密码',widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}))# 密码验证re_password = forms.CharField(max_length=8,min_length=3,label='确认密码',widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}))def clean(self):# 这里的self是自己类,MyRegForm# 校验密码和确认密码是否一致password = self.cleaned_data.get('password')re_password = self.cleaned_data.get('re_password')if not password == re_password:# 展示提示信息self.add_error('re_password','两次密码不一致')   // 添加报错信息return self.cleaned_data
form组件其他参数及补充知识点
max_length			//允许输入的最大长度
min_length			//最小长度label    		input的提示信息,name、password等error_messages   	自定义报错的提示信息'max_length':"用户名最长8位",'min_length':"用户名最短3位",'required':"用户名不能为空"required     	设置字段是否允许为空
initial            设置默认值widget             控制type类型及属性   type   classs#多个属性用空格widget=forms.widgets.TextInput(attrs={'class': 'form-control c1 c2'})widget=forms.widgets.PasswordInput()###正则校验及报错信息,并且支持多个validator  			phone = forms.CharField(validators=[RegexValidator(r'^[0-9]+$', '请输入数字'),   RegexValidator(r'^159[0-9]+$', '数字必须以159开头')])
其他字段属性
性别校验
    gender = forms.ChoiceField(choices=((1, "男"), (2, "女"), (3, "保密")),label="性别",initial=3,widget=forms.widgets.RadioSelect())
爱好单选 select校验
    hobby = forms.ChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=3,widget=forms.widgets.Select()   # 单选)

爱好多选select 校验1
    hobby1 = forms.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.SelectMultiple())

爱好多选chekbox校验2
    hobby2 = forms.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple())

是否记住密码校验
    keep = forms.ChoiceField(label="是否记住密码",initial="checked",widget=forms.widgets.CheckboxInput())

详细请参考:https://www.cnblogs.com/guyouyin123/p/12189453.html