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

Django登录注册项目:如何阻止重复邮箱注册?

解决Django注册时邮箱重复未提示的问题

问题原因

Django默认的User模型中,email字段并未设置唯一约束,调用create_user方法时只会校验username的唯一性,不会检查邮箱是否已存在。你的Members模型虽设置了email = models.EmailField(unique=True),但注册流程中并未创建Members实例,因此该模型的唯一约束不会触发校验。

解决方案

在注册视图中手动添加邮箱唯一性检查,若邮箱已存在则返回错误提示,同时统一使用Django的messages框架优化用户体验:

修改后的views.py代码

from django.contrib import messages

def signup_page(request):
    if request.method == 'POST':
        uname = request.POST.get('username')
        email = request.POST.get('email')
        pass2 = request.POST.get('password2')
        pass1 = request.POST.get('password1')

        # 检查密码一致性
        if pass1 != pass2:
            messages.error(request, "密码与确认密码不匹配!")
            return render(request, 'registartion.html')
        
        # 检查用户名是否已存在
        if User.objects.filter(username=uname).exists():
            messages.error(request, "该用户名已注册")
            return render(request, 'registartion.html')
        
        # 检查邮箱是否已存在
        if User.objects.filter(email=email).exists():
            messages.error(request, "该邮箱已注册")
            return render(request, 'registartion.html')
        
        # 创建并保存用户
        my_user = User.objects.create_user(uname, email, pass1)
        my_user.save()
        messages.success(request, "注册成功")
        return redirect(reverse('login_page'))   
    
    return render(request, 'registartion.html')

# login_page 代码优化
def login_page(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pass1 = request.POST.get('pass')
        user = authenticate(request, username=username, password=pass1)
        if user is not None:
            login(request, user)
            messages.info(request, "登录成功")
            return redirect(reverse('dashboard_page'))
        else:
            messages.error(request, "用户名或密码错误")
            return render(request, 'login.html')

    return render(request, 'login.html')

关键修改点

  1. 新增邮箱唯一性校验:通过User.objects.filter(email=email).exists()判断邮箱是否已注册,存在则添加错误提示并返回注册页面。
  2. 统一错误提示逻辑:替换原有的HttpResponse为messages框架,让用户在注册页面内直接看到提示,无需跳转至纯文本页面。
  3. 主动校验用户名:提前检查用户名是否存在,避免数据库约束抛出异常,提升提示友好度。

模板层适配(可选)

在registartion.html中添加消息展示代码,确保提示能正常显示:

{% if messages %}
    {% for message in messages %}
        <div class="alert alert-{{ message.tags }}">
            {{ message }}
        </div>
    {% endfor %}
{% endif %}

进阶优化(可选)

若希望从模型层面强制邮箱唯一性,可自定义User模型:

# models.py
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)

然后在settings.py中配置:

AUTH_USER_MODEL = '你的应用名.CustomUser'

此方式会让数据库层面强制邮箱唯一,create_user方法会自动校验邮箱,无需手动检查。

内容的提问来源于stack exchange,提问作者Shivang Kant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:34:51