如何在Django视图中为自建users模型实现邮箱及密码验证?
解决用户注册时的邮箱唯一性与密码长度验证问题
没问题,我来帮你搞定这个注册验证的需求,咱们分几步来实现:
第一步:给数据库加层兜底保障(可选但强烈推荐)
首先在models.py的users模型里给邮箱字段加上unique=True,这样数据库会直接拒绝重复邮箱的插入,避免并发场景下(比如两个用户同时用同一个邮箱注册)出现漏网的重复数据:
class users(models.Model): # 新增unique=True确保邮箱在数据库中唯一 email=models.CharField(max_length=50, default='0000000', unique=True) password=models.CharField(max_length=50, default='0000000') room = models.ForeignKey(rooms,on_delete=models.CASCADE) goal = models.ManyToManyField(goals) style = models.ManyToManyField(designs)
第二步:在视图层添加验证逻辑
修改views.py里的user_register函数,在保存用户之前先做密码长度和邮箱唯一性的检查,同时把错误信息返回给模板,让用户直观知道哪里出错了:
def user_register(request): errors = [] # 用来收集所有验证错误信息 if request.method == 'POST': email = request.POST['email'] password = request.POST['password'] room = request.POST['room'] g = request.POST['goal'].split(',') s = request.POST['style'].split(',') # 验证密码长度不超过8字符 if len(password) > 8: errors.append("密码长度不能超过8个字符") # 验证邮箱是否已被注册 if users.objects.filter(email=email).exists(): errors.append("这个邮箱已经被注册啦,换一个试试吧") # 没有错误的话才执行用户保存逻辑 if not errors: user = users(password=password, email=email) user.room = rooms.objects.get(pk=room) goal = goals.objects.filter(pk__in=g) style = designs.objects.filter(pk__in=s) user.save() user.goal.add(*goal) user.style.add(*style) return render(request,'home.html') # GET请求或者验证失败时,返回注册页并携带错误信息 return render(request, '你的注册模板文件名.html', {'errors': errors})
第三步:在模板中显示错误提示
把错误信息展示给用户,同时可以提前加个密码长度的提示,让用户提前知道规则:
<div class="card-body"> <!-- 显示验证错误信息 --> {% if errors %} <div class="alert alert-danger"> {% for error in errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %} <form action="{% url 'car:user_register' %}" method="POST" > {% csrf_token %} <div class="form-group"> <label for="username">Username</label> <input type="text" name="username" class="form-control" required> </div> <div class="form-group"> <input type="hidden" name="room" id="name" value=" "> </div> <div class="form-group" > <input type="hidden" name="goal" id="goal" value=" "> </div> <div class="form-group" > <input type="hidden" name="style" id="style" value=" "> </div> <div class="form-group"> <label for="email">Email</label> <input type="text" name="email" class="form-control" required> </div> <div class="form-group"> <label for="password2">Password</label> <input type="password" name="password" class="form-control" required> <!-- 提前提示用户密码长度限制 --> <small class="form-text text-muted">密码长度不能超过8个字符</small> </div> <input type="submit" value="Register" class="btn btn-secondary btn-block"> </form> </div> </div> </div>
内容的提问来源于stack exchange,提问作者NSTA
相关产品推荐
相关产品推荐

