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

如何在Django中使用正则表达式实现严格的邮箱格式验证

在Django中实现严格的邮箱格式验证

1. 创建自定义邮箱验证器

新建一个单独的validators.py文件(单独存放更便于复用),定义基于正则的严格验证规则:

from django.core.exceptions import ValidationError
import re

def validate_strict_email(value):
    # 正则规则:本地部分仅允许字母、数字、下划线、点、减号;域名符合常规邮箱格式
    strict_email_regex = r'^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    if not re.fullmatch(strict_email_regex, value):
        raise ValidationError('请输入有效的邮箱地址,用户名部分仅支持字母、数字、下划线、点和减号。')

2. 在注册表单中应用验证器

修改forms.py,为CustomUserCreationForm的邮箱字段替换默认验证逻辑,使用自定义的严格验证器:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
from .validators import validate_strict_email

class CustomUserCreationForm(UserCreationForm):
    # 重定义email字段,绑定严格验证器
    email = forms.EmailField(
        validators=[validate_strict_email],
        required=True,
        label='邮箱'
    )

    class Meta:
        model = User
        fields = ['first_name', 'email', 'username', 'password1', 'password2']
        labels = {'first_name':'姓名',}

3. 同步Profile模型的验证规则(可选)

为保证Profile模型中的邮箱数据也符合严格格式,修改models.py中的邮箱字段验证器:

from django.db import models
from django.contrib.auth.models import User
import uuid
from .validators import validate_strict_email

class Profile(models.Model):
    user     = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
    name     = models.CharField(max_length=300, null=True, blank=True)
    email    = models.EmailField(max_length=200, null=True, blank=True, validators=[validate_strict_email])
    username = models.CharField(max_length=200, null=True, blank=True)
    created  = models.DateTimeField(auto_now_add=True)
    id       = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

    def __str__(self):
        return str(self.user.username)

验证效果

当用户输入john#doe@gmail.com这类包含非常规特殊字符的邮箱时,表单会触发验证错误,阻止注册流程,并返回自定义的错误提示。

可选调整

如果需要支持部分邮箱服务商允许的+符号(如john+tag@gmail.com),可将正则规则修改为:

strict_email_regex = r'^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:07:17