form校验组件
导包:
from django import forms
from django.forms import widgets
定义类:
class MyForm(forms.Form):
username = forms.CharField(min_length=3, max_length=8, label='用户名:', error_messages={
'min_length': '最少3位',
'max_length': '最多8位',
'required': '用户名不可以为空'
}, widget=widgets.TextInput(attrs={'class': 'form-control'})) # 可以添加样式
password = forms.CharField(min_length=3, max_length=8, label='密码:', error_messages={
'min_length': '最少3位',
'max_length': '最多8位',
'required': '密码不可以为空'
}, widget=widgets.PasswordInput(attrs={'class': 'form-control'}))
email = forms.EmailField(error_messages={
'required': '你的邮箱不可以是空的',
'invalid': '邮箱格式不正确'
}, required=False, widget=widgets.EmailInput(attrs={'class': 'form-control'}))
# 局部钩子
def clean_username(self):
if 'a' in self.cleaned_data.get('username'):
self.add_error('username', '含有敏感词汇')
return self.cleaned_data.get('username')
# 全局钩子
def clean(self):
# 可以用来比较两个框里的东西
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username != password:
self.add_error('password', '账号密码必须一样')
return self.cleaned_data
类中的字段属性
min_length: 最少多少位
max_length: 最多多少位
widget=widgets.类型Input() : 更改标签类型,还有好多中,单选按钮,复选, 下拉框
widget=widgets.TextInput(attrs={'class': 'form-control'})): 可以添加标签
error_messages: 更改错误提示信息
required:
- 在error_messages中使用:为空提示信息
- 不在error_messages中使用: required=False 为空不提示报错
invalid: 邮箱格式
类中的方法
局部钩子
格式:
def clean_标签的name(self):
...
必须有返回值,拿什么返回什么
-
通过
cleaned_data
拿到符合条件的数据,对数据进行进一步处理
username = self.cleaned_data.get('username')
-
在通过
add_error('username', '你这个数据不符合我的处理条件,回去吧')
这样添加对应的返回显示在前端的提示语句. -
最后要
return username
全局钩子
格式:
def clean(self):
...
也是必须有返回值,拿什么返回什么
-
通过
cleaned_data
拿到符合条件的数据,对数据进行进一步处理
password= self.cleaned_data.get('password')
re_pwd= self.cleaned_data.get('re_pwd')
-
这个的逻辑处理是比较两个框传过来的值,而不是对单一的传过来的值处理(例如: 注册的时候校验两次输入的密码)
-
也是通过
add_error('username', '你这个数据不符合我的处理条件,回去吧')
这样添加对应的返回显示在前端的提示语句. -
最后返回的是
return self.cleaned_data
视图函数
def form_test(request):
form_obj = MyForm()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
email = request.POST.get('email')
form_obj = MyForm({'username': username, 'password': password,'email': email})
return render(request, 'form_test.html', locals())
前端显示的三种格式
第一种
这种是直接把input框放进p标签里面,并且根据后端的类里的数据个数去创建对应个数标签
{{ form_obj.as_p }}
这种是直接把input框放进ul标签里面,并且根据后端的类里的数据个数去创建对应个数标签
{{ form_obj.as_ul }}
第二种
<p>
{{ form_obj.username.label }}{{ form_obj.username }}
</p>
<span>{{ form_obj.username.errors.0 }}</span>
<p>
{{ form_obj.password.label }}{{ form_obj.password }}
</p>
<span>{{ form_obj.username.errors.0 }}</span>
第三种(推荐使用)
{% for foo in form_obj %}
<p>
{{ foo.label }}{{ foo }}
<span>{{ foo.errors.0 }}</span>
</p>
{% endfor %}