我用django form的表单生产的注册界面
email = forms.EmailField(label='邮箱',
widget=forms.EmailInput(attrs={'class':'form-control','placeholder':'请输入邮箱'}))
同时用form做邮箱验证邮箱是否已经注册,如下图,这个没问题
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
raise forms.ValidationError('邮箱已经被使用')
return email
同时我还想用form验证邮箱后缀是否为qq,如下图,但是就是不行,不是qq邮箱还是可以注册,怎么做邮箱后缀的验证?谢谢
def clean_qq_email(self):
email = self.cleaned_data['email']
if not '@qq' in email :
raise forms.ValidationError('必须是用qq才可以注册')
return email
import re
dict_email = {
r'[1-9]\d{4,7}@qq\.com$': 'qq邮箱',
r'[a-z1-9][a-z1-9_]{2,14}[a-z0-9]@sina\.com$': '新浪普通邮箱',
r'1[3456789]\d{9}@sina\.cn$': '新浪手机邮箱',
r'[a-zA-Z]\w{5,17}@163\.com$': '网易普通邮箱',
r'[a-zA-Z][a-zA-Z0-9_.]{4,19}@vip\.163\.com$': '网易VIP邮箱'
}
def check(addr):
n = 1
for pattern, email in dict_email.items():
if re.match(pattern, addr):
print(f'{addr}为{email}')
break
elif n == len(dict_email):
print(f'{addr}不是邮箱账号')
else:
n += 1
check('143379@qq.com')
check('143379@qq\.com')
check('a823456@sina.com')
check('a823456@sina.comg')
check('15187632190@sina.cn')
check('05187632190@sina.cn')
check('A123456789@163.com')
check('123456789A@163.com')
check('a._0a2b3c@vip.163.com')
check('.a_0a2b3c@vip.163.com')
用正则表达式验证
email = forms.CharField(validators=[QQEmailValidator()])
@deconstructible
class QQEmailValidator(validators.RegexValidator):
regex = r'^\d{5, 12}@qq\.com$'
message = '请输入正确的qq邮箱'
flags = 0