基本用法
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