在forms.py中写局部钩子函数
首先还是得先导入app里面的models
#重写username字段的局部钩子
def clean_username(self):
username = self.cleaned_data.get("username")
is_exist = models.UserInfo.objects.filter(username=username)
# 判断用户名是否已存在,可以放到钩子函数里
if is_exist:
self.add_error("username",ValidationError("用户名已存在"))
在验证注册的视图函数里,在通过验证之后加上判断用户名是否存在的判断
# 注册的视图函数
def register(request):
if request.method == "POST":
ret = {"status": 0, "msg": ""}
form_obj = forms.RegForm(request.POST)
print(request.POST)
# 帮我做校验
if form_obj.is_valid():
# 校验通过,去数据库创建一个新的用户
username = form_obj.cleaned_data.get("username")
is_exist = models.UserInfo.objects.filter(username=username)
# 判断用户名是否已存在,可以放到钩子函数里
if is_exist:
ret['status'] = 1
ret['msg'] = '用户名已存在'
return JsonResponse(ret)
form_obj.cleaned_data.pop("re_password")
avatar_img = request.FILES.get("avatar")
models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img,phone="123123")
ret["msg"] = "/index/"
return JsonResponse(ret)
else:
print(form_obj.errors)
ret["status"] = 1
ret["msg"] = form_obj.errors
print(ret)
print("=" * 120)
return JsonResponse(ret)
# 生成一个form对象
form_obj = forms.RegForm()
print(form_obj.fields)
return render(request, "register.html", {"form_obj": form_obj})
前后端交互,前端写一个username输入框失去焦点事件后发送用户名给后端的GET或者POST请求,后端接受请求,判断返回json包
前端
//给username input框绑定一个失去焦点事件,失去焦点之后及校验用户名是否已注册
$("#id_username").blur(function () {
//取到用户填写的值
var username = $(this).val();
//发请求
$.ajax({
url:"/check_username_exist/",
type: "get",
data:username,
success:function (data) {
if(data.status){
//用户名已经被注册
$("#id_username").next().text(data.msg).parent().parent().addClass("has-error");
}else {
//不做操作
}
}
})
后端
def check_username_exist(request):
ret={"status":0,"msg":""}
username=request.GET.get("username")
is_exist = models.UserInfo.objects.filter(username=username)
if is_exist:
ret["status"] = 1
ret["msg"] = "用户名已被注册"
return JsonResponse(ret)