Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
本次注册涉及到使用短信验证码和图形验证码,所以在进行注册表单验证时,不仅有用户名、密码和手机号,还需要对前端传过来的验证码进行比对验证。
同样,在注册表单中,也继承了表单验证错误消息提示 Mixin 类。
① 表单验证错误消息提示
Mixin 类,实现多继承;使用Mixin类实现多重继承要非常小心。
class FormMixin(object):
def get_error(self):
# 映射
if hasattr(self, 'errors'):
errors = self.errors.get_json_data()
# 随机抽取
error_tuple = errors.popitem()
error_list = error_tuple[1]
error_dict = error_list[0]
message = error_dict['message']
return message
else:
return None
② 注册表单
telephone = forms.CharField(max_length=11, min_length=11, error_messages={
"required": "必须输入手机号码!", "min_length": "手机号码个数必须是11位!", "max_length": "手机号码个数必须是11位!"})
username = forms.CharField(max_length=20, min_length=3, error_messages={"required": "必须输入用户名!", 'min_length': "用户名最少不能少于3个字符", "max_length": "用户名最多不能超过20个字符!"})
img_captcha = forms.CharField(max_length=4, min_length=4, error_messages={"required": "请输入图形验证码"})
password1 = forms.CharField(min_length=6, max_length=20, error_messages={"required": "必须输入密码!", "min_length": "密码最少不能少于6位!", "max_length": "密码最多不能超过20位!"})
password2 = forms.CharField(min_length=6, max_length=20, error_messages={"required": "请重新输入密码!", "min_length": "密码最少不能少于6位!", "max_length": "密码最多不能超过20位!"})
sms_captcha = forms.CharField(max_length=4, min_length=4, error_messages={"required": "请输入短信验证码"})
Form表单的功能
处理表单数据
表单数据都被存储在form.cleaned_data对象中(字典类型,意为经过清洗的数据),而且数据会被自动转换为Python对象。
重写 clean 方法 is_valid
def validate_data(self, request):
cleaned_data = self.cleaned_data
password1 = cleaned_data.get('password1')
password2 = cleaned_data.get('password2')
if password1 != password2:
return self.add_error("password1", "两次密码输入不一致!")
img_captcha = cleaned_data.get('img_captcha')
server_img_captcha = request.session.get('img_captcha')
if img_captcha.lower() != server_img_captcha.lower():
return self.add_error('img_captcha', "图形验证码错误!")
sms_captcha = cleaned_data.get('sms_captcha')
server_sms_captcha = request.session.get('sms_captcha')
if sms_captcha.lower() != server_sms_captcha.lower():
return self.add_error('sms_captcha', '短信验证码错误!')
# 验证用户是否存在
telephone = cleaned_data.get('telephone')
exists = User.objects.filter(telephone=telephone).exists()
if exists:
return self.add_error('telephone', '该手机号码已经存在!')
return True
③ 注册视图
在重构 USER 模型中,User 模型自定义管理器,创建普通用户。
user = User.objects.create_user(telephone=telephone, username=username, password=password)
login(request, user)
if form.is_valid() and form.validate_data(request):
class RegisterView(View):
def get(self, request):
return render(request, 'auth/register.html')
def post(self, request):
form = RegisterForm(request.POST)
if form.is_valid() and form.validate_data(request):
telephone = form.cleaned_data.get('telephone')
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = User.objects.create_user(telephone=telephone, username=username, password=password)
login(request, user)
return redirect(reverse('news:index'))
else:
message = form.get_error()
messages.info(request, message)
return redirect(reverse('xfzauth:register'))