You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:37