章节13
课时274
【后端开发】发布新闻功能完成
实际开发中的登录验证器
#froms.py
#encoding: utf-8
from django import forms
from apps.forms import FormMixin
from django.core.cache import cache
from .models import User
class LoginForm(forms.Form,FormMixin):
telephone = forms.CharField(max_length=11)
password = forms.CharField(max_length=20,min_length=6,error_messages={"max_length":"密码最多不能超过20个字符!","min_length":"密码最少不能少于6个字符!"})
remember = forms.IntegerField(required=False)
上面的LoginForm的类是让HTML验证用户的登录账号和密码。属于后端的登录验证。这里的作用是,前端客户输入数据时,后端调用数据库进行配对。
class RegisterForm(forms.Form,FormMixin):
telephone = forms.CharField(max_length=11)
username = forms.CharField(max_length=20)
password1 = forms.CharField(max_length=20, min_length=6,
error_messages={"max_length": "密码最多不能超过20个字符!", "min_length": "密码最少不能少于6个字符!"})
password2 = forms.CharField(max_length=20, min_length=6,
error_messages={"max_length": "密码最多不能超过20个字符!", "min_length": "密码最少不能少于6个字符!"})
img_captcha = forms.CharField(min_length=4,max_length=4)
sms_captcha = forms.CharField(min_length=4,max_length=4)
def clean(self):
cleaned_data = super(RegisterForm, self).clean()
password1 = cleaned_data.get('password1')
password2 = cleaned_data.get('password2')
if password1 != password2:
raise forms.ValidationError('两次密码输入不一致!')
img_captcha = cleaned_data.get('img_captcha')
cached_img_captcha = cache.get(img_captcha.lower())
if not cached_img_captcha or cached_img_captcha.lower() != img_captcha.lower():
raise forms.ValidationError("图形验证码错误!")
telephone = cleaned_data.get('telephone')
sms_captcha = cleaned_data.get('sms_captcha')
cached_sms_captcha = cache.get(telephone)
if not cached_sms_captcha or cached_sms_captcha.lower() != sms_captcha.lower():
raise forms.ValidationError('短信验证码错误!')
exists = User.objects.filter(telephone=telephone).exists()
if exists:
forms.ValidationError('该手机号码已经被注册!')
return cleaned_data
这里是重写了整个验证规则,从def clean开始就是把django的forms,moudels重写了,用来验证手机验证码,验证图片,最后是验证客户是否存在
自定义验证:
有时候对一个字段验证,不是一个长度,一个正则表达式能够写清楚的,还需要一些其他复杂的逻
辑,那么我们可以对某个字段,进行自定义的验证。比如在注册的表单验证中,我们想要验证手机
号码是否已经被注册过了,那么这时候就需要在数据库中进行判断才知道。