le }}#}
{# </table>#}
{{ myform.as_p }}
<input type="submit" value="提交">
</form>
渲染错误信息功能
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="/static/jquery-3.3.1.js"></script>
<title>注册</title>
</head>
<body>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post" novalidate>
{% for foo in myform %}
<p>{{ foo.label }}:{{ foo }} <span class="pull-right">{{ foo.errors.0 }}</span></p>
{% endfor %}
<input type="submit" value="提交"><span>{{error_all.0 }}</span>
</form>
<hr>
<form action="" method="post" novalidate>
<p>用户名:{{ myform.name }} <span>{{ myform.errors.name }}</span></p>
<p>用户名:{{ myform.pwd }} <span>{{ myform.errors.pwd }}</span></p>
<p>用户名:{{ myform.email }} <span>{{ myform.errors.email }}</span></p>
<input type="submit" value="提交">
</form>
</div>
</div>
</body>
</html>
后端代码
from app01.MyForm import RegForm
def register(request):
if request.method == 'GET':
myform = RegForm()
else:
myform = RegForm(request.POST)
if myform.is_valid():
# 存数据库,保存这个人
print(myform.cleaned_data)
else:
# 校验不通过,这里面也可能有值
# 总错误信息{'name':['太长了',],'pwd':['太短了']}
# print(myform.cleaned_data)
# 总错误
# myform.glo_err=myform.errors.get('__all__')
error_all = myform.errors.get('__all__')
# print()
# 每一个的错误信息
# for item in myform:
# # ['太长了',]
# # print(item.errors[0])
# # print(type(item.errors))
# from django.forms.utils import ErrorList
# # print(item.errors.as_data())
# print(item.errors)
# # print(type(item.errors))
return render(request, 'register.html', locals())
组件的参数设置
class RegForm(forms.Form):
name = forms.CharField(max_length=8, min_length=3, label='用户名',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
pwd = forms.CharField(max_length=8, min_length=3, label='密码',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.PasswordInput(attrs={'class': 'form-control'})
)
re_pwd = forms.CharField(max_length=8, min_length=3, label='确认密码',
error_messages={'max_length': '太长了',
'min_length': '太短了',
'required': '该项不能为空'
},
widget=widgets.PasswordInput(attrs={'class': 'form-control'})
)
email = forms.EmailField(label='邮箱', error_messages={'invalid': '格式不正确',
'required': '该项不能为空'
},
widget=widgets.EmailInput(attrs={'class': 'form-control'})
)
局部钩子
继承自 Form类的校验类,可以对类中的每个字段进行校验,校验通过后的数据会放在 clean_data中,没通过的放在errors中,可以通过字段名取值,那么校验通过的字段如果还需要进行其他的判断,比如是否有敏感词,这些单单依靠字段的校验是完成不了的。所以 Django 提供了局部钩子函数,当每个字段进行校验完成后会自动调用该钩子函数。看源码就很清楚了。
首先,所有的数据校验都是调用了 Form 对象的 is_valid()方法进行的。所以进入is_valid()方法。
self.is_bou