Django目录://www.greatytc.com/p/dc36f62b3dc5
什么是钩子
钩子就是forms的自定义规则。
规则1:用户名不能重复。
规则2:密码不能是纯数字。
局部钩子
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class UserForm(forms.Form):
#自定义报错信息
msg={'required':'该字段不能为空'}
#设置name长度不能超过5.
name=forms.CharField(max_length=5,error_messages=msg,label='用户名')
#设置密码只能是纯数字.
pwd=forms.CharField(label='密码')
email=forms.EmailField(error_messages={"invalid":"邮箱格式不正确"},label='邮箱')
#自定义钩子
def clean_name(self):
val = self.cleaned_data.get('name')
ret = UserInfo.objects.filter(name=val)
if not ret:
return val
else:
raise ValidationError("用户名已存在!")
def clean_pwd(self):
val = self.cleaned_data.get("pwd")
if val.isdigit():
raise ValidationError("密码不能是纯数字!")
else:
return val
页面截图
全局钩子
规则1:密码与确认密码要一样。
formsDemo.app01.views.py
------------------------
from django.shortcuts import render,HttpResponse
from app01.models import UserInfo
#使用forms进行校验的话,必须设置一个forms的类用来定义规则。
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class UserForm(forms.Form):
#自定义报错信息
msg={'required':'该字段不能为空'}
#设置name长度不能超过5.
name=forms.CharField(max_length=5,error_messages=msg,label='用户名')
pwd=forms.CharField(label='密码')
r_pwd=forms.CharField(label='确认密码')
email=forms.EmailField(error_messages={"invalid":"邮箱格式不正确"},label='邮箱')
#自定义钩子
def clean_name(self):
val = self.cleaned_data.get('name')
ret = UserInfo.objects.filter(name=val)
if not ret:
return val
else:
raise ValidationError("用户名已存在!")
def clean_pwd(self):
val = self.cleaned_data.get("pwd")
if val.isdigit():
raise ValidationError("密码不能是纯数字!")
else:
return val
#全局钩子
def clean(self):
pwd=self.cleaned_data.get("pwd")
r_pwd=self.cleaned_data.get("r_pwd")
if pwd and r_pwd:
if pwd == r_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致!')
else:
raise ValidationError('密码不能为空')
def register(request):
if request.method=="POST":
form = UserForm(request.POST)
# is_valid 用来校验数据是否合法
if form.is_valid():
print(form.cleaned_data) # 所有干净的字段以及对应的值
#将合法数据写入数据库
UserInfo.objects.create(**form.cleaned_data)
#返回ok
return HttpResponse("OK")
else:
# cleaned_data输出不合法数据 errors输出字段错误信息
print(form.cleaned_data)
print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
# 获取错误
error = form.errors
#获取全局钩子的错误信息
g_error = form.errors.get("__all__")
#将错误返回给模板
return render(request, "register.html", locals())
else:
form = UserForm()
return render(request,'register.html',locals())
formsDemo.templates.register.html
---------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.error{
color:red;
}
</style>
</head>
<body>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }}
<span class="pull-right" style="color: red">
{% if field.label == '确认密码' %}
<span>{{ g_error.0|default:"" }}</span>
{% endif %}
{{ field.errors.0 }}
</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default">
</form>
</body>
</html>
页面截图