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

Django用户注册如何实现邮箱是否已存在数据库的校验

Django注册邮箱重复校验解决方案

你无需执行此前设想的单独定义邮箱字段、从Meta的fields移除email这两步操作,Django的ModelForm会自动基于User模型的email字段生成对应表单字段,直接新增邮箱校验方法即可。


修改后的完整forms.py代码

from django import forms
from django.contrib.auth.models import User


class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(label='Hasło', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Powtórz hasło', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'email')

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Hasła nie są identyczne.')
        return cd['password2']
    
    # 新增邮箱校验方法
    def clean_email(self):
        # 获取表单清洗后的邮箱输入值
        email = self.cleaned_data['email']
        # ORM查询数据库中是否存在相同邮箱的用户
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('该邮箱已被注册,请更换其他邮箱')
        # 校验通过返回邮箱值
        return email

逻辑说明

  • 查询数据库邮箱使用Django ORM语法:User.objects.filter(email=email).exists(),该语句会直接查询auth_user表中是否存在匹配的邮箱记录,返回布尔值,查询性能较高
  • 原有views.py代码无需任何修改,表单调用is_valid()方法时会自动执行clean_email的校验逻辑,校验不通过时错误信息会自动同步到前端表单错误中
  • 如果你需要全局限制邮箱唯一,可在自定义User模型时给email字段添加unique=True约束,数据库层面也会避免重复数据插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:54:01