用户注册
js部分
let $register = $('.form-contain'); // 获取注册表单元素
$register.submit(function (e) {//设置点击函数触发
// 阻止默认提交操作
e.preventDefault();
// 获取用户输入的内容
let sUsername = $username.val(); // 获取用户输入的用户名字符串
let sPassword = $("input[name=password]").val();//获取用户的密码
let sPasswordRepeat = $("input[name=password_repeat]").val();//获取用户第二次输入的密码
let sMobile = $mobile.val(); // 获取用户输入的手机号码字符串
// 判断用户名是否已注册
if (fn_check_username() !== "success") {
return
}
// 判断手机号是否为空,是否已注册
if (fn_check_mobile() !== "success") {
return
}
// 判断用户输入的密码是否为空
if ((!sPassword) || (!sPasswordRepeat)) {
message.showError('密码或确认密码不能为空');
return
}
// 判断用户输入的密码和确认密码长度是否为6-20位
if ((sPassword.length < 6 || sPassword.length > 20) ||
(sPasswordRepeat.length < 6 || sPasswordRepeat.length > 20)) {
message.showError('密码和确认密码的长度需在6~20位以内');
return
}
// 判断用户输入的密码和确认密码是否一致
if (sPassword !== sPasswordRepeat) {
message.showError('密码和确认密码不一致');
return
}
// 发起注册请求
// 1、创建请求参数
let SdataParams = {
"username": sUsername,
"password": sPassword,
"password_repeat": sPasswordRepeat,
"mobile": sMobile,
};
// 2、创建ajax请求
$.ajax({
// 请求地址
// url: "/user/register/", // url尾部需要添加/
// 请求方式
type: "POST",
data: JSON.stringify(SdataParams),
// 请求内容的数据类型(前端发给后端的格式)
contentType: "application/json; charset=utf-8",
// 响应数据的格式(后端返回给前端的格式)
dataType: "json",
})
.done(function (res) {
if (res.errno === "0") {
// 注册成功
message.showSuccess('恭喜你,注册成功!');
setTimeout(() => {
// 注册成功之后重定向到主页
window.location.href = '/news/index/';
}, 1500)
} else {
// 注册失败,打印错误信息
message.showError(res.errmsg);
}
})
.fail(function(){
message.showError('服务器超时,请重试!');
});
});
form表单进行数据的清洗
from django import forms
import re
from django.contrib.auth import login
from django.db.models import Q
from apps.user.models import Users
#定义一个注册的表单
class RegisterForm(forms.Form):
#用户名,格式必须和前面的js的请求参数一致
username = forms.CharField(label='用户名', max_length=20, min_length=5,
error_messages={"min_length": "用户名长度要大于5",
"max_length": "用户名长度要小于20",
"required": "用户名不能为空"}
)
#密码
password = forms.CharField(label='密码', max_length=20, min_length=6,
error_messages={"min_length": "密码长度要大于6",
"max_length": "密码长度要小于20",
"required": "密码不能为空"}
)
#再次输入密码
password_repeat = forms.CharField(label='确认密码', max_length=20, min_length=6,
error_messages={"min_length": "密码长度要大于6",
"max_length": "密码长度要小于20",
"required": "密码不能为空"}
)
#手机号
mobile = forms.CharField(label='手机号', max_length=11, min_length=11,
error_messages={"min_length": "手机号长度有误",
"max_length": "手机号长度有误",
"required": "手机号不能为空"})
#判断用户名和手机号是否已经注册
def clean_mo_un(self):
users = self.cleaned_data.get('username')
tel = self.cleaned_data.get('mobile')
if Users.objects.filter(username=users,mobile=tel).exists():
#如果已注册则抛出错误
raise forms.ValidationError("用户名或手机号已注册,请重新输入!")
#没有注册的话则返回用户名和手机号
return users,tel
def clean(self):
"""
"""
#j继承原有的clean方法
cleaned_data = super().clean()
#获取密码和第二次密码
passwd = cleaned_data.get('password')
passwd_repeat = cleaned_data.get('password_repeat')
if passwd != passwd_repeat:
raise forms.ValidationError("两次密码不一致")
tel = cleaned_data.get('mobile')
视图函数
#写一个注册的类视图
class RegisterView(View):
def get(self,request):
return render(request,'users/register.html')
def post(self,request):
#获取js传过来的输入
json_str = request.body
#判断传过来的数据是否有误
if not json_str:
return to_json_data(errno=Code.PARAMERR,errmsg='输入的数据有误')
#将传过来的数据转换成字典的格式
data_dict = json.loads(json_str.decode('utf8'))
#将字典格式的数据进行数据的清洗
form = forms.RegisterForm(data=data_dict)
#判断传过去的数据是否合理
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
mobile = form.cleaned_data.get('mobile')
#将数据保存到数据库
user = Users.objects.create_user(username=username,password=password,mobile=mobile)
#登录
login(request,user)
return to_json_data(errmsg='恭喜您注册成功')
#如果数据清洗不通过,将错误输出
else:
err_msg_list = []
for item in form.errors.get_json_data().values():
err_msg_list.append(item[0].get('message'))
err_msg_str = '/'.join(err_msg_list) # 拼接错误信息为一个字符串
return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)