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

如何在Django默认用户模型用户名中允许空格?覆写验证器无效

如何在Django默认用户模型的用户名中允许空格?

我之前也踩过这个坑,默认Django User模型的用户名限制确实挺严格的——核心问题是默认的UnicodeUsernameValidator验证器用的正则表达式不允许空格。你之前覆写验证器没成功,大概率是没覆盖到模型+表单两个层面,或者正则规则写得有问题。下面是一步步的解决办法:

推荐方案:自定义用户模型(Django官方推荐)

直接修改默认User模型不是长久之计,后续扩展或维护容易出问题。最稳妥的方式是创建自定义用户模型,完全掌控用户名的验证逻辑:

1. 编写允许空格的自定义验证器

先写一个替换默认规则的验证器,让它支持空格:

# 在你的app的models.py中
from django.core.validators import RegexValidator
from django.utils.translation import gettext_lazy as _

class UsernameWithSpaceValidator(RegexValidator):
    # 正则允许字母、数字、下划线、@、.、+、-和空格
    regex = r'^[\w.@+\- ]+$'
    message = _(
        "用户名仅支持字母、数字、@、.、+、-和空格,长度不超过150字符。"
    )
    flags = 0

2. 定义自定义用户模型

继承AbstractUser,重写username字段并使用上面的验证器:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    username = models.CharField(
        _("用户名"),
        max_length=150,
        unique=True,
        help_text=_("必填项,最多150字符,允许字母、数字、@、.、+、-和空格。"),
        validators=[UsernameWithSpaceValidator()],
        error_messages={
            "unique": _("该用户名已被占用。"),
        },
    )

    # 可选:处理前后空格(如果不想让前后空格作为用户名的一部分)
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if username:
            # 去除前后空格,保留中间的空格
            username = username.strip()
            self.cleaned_data['username'] = username
        return username

3. 配置项目使用自定义用户模型

在settings.py中添加这一行,告诉Django用你的自定义模型:

AUTH_USER_MODEL = '你的app名称.CustomUser'

4. 同步自定义用户表单(关键!)

默认的UserCreationForm和UserChangeForm还是会用旧的验证规则,必须同步自定义表单:

# 在你的app的forms.py中
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email')

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email')

如果你非要修改默认User模型(不推荐)

如果项目已经运行很久,不想迁移到自定义模型,可以尝试动态修改默认验证器,但风险较高:

# 在项目的__init__.py或者app的ready方法中
from django.contrib.auth.validators import UnicodeUsernameValidator

# 替换默认正则,加入空格
UnicodeUsernameValidator.regex = r'^[\w.@+\- ]+$'

这种方法不推荐,因为Django版本更新可能会覆盖这个修改,而且后续扩展会有隐患。

常见坑点排查

  • 只改了模型验证器,没改表单:默认表单会自带独立验证,必须同步替换表单才能生效。
  • 正则表达式错误:减号-在正则里如果不在开头或结尾需要转义,或者直接放在末尾(比如[\w.@+ -])。
  • 没设置AUTH_USER_MODEL:Django依然会使用默认User模型,你的修改根本不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:02:53