Django 允许在 UserChangeForm 中的用户名中使用空格

Django allow spaces in username within UserChangeForm

有点令人沮丧的问题,有几个类似的问题,但我似乎无法得到任何适合我的答案。

首先:signup/login 在我的网站上是完全通过 django-allauth 完成的。它有一个设置 ACCOUNT_USERNAME_VALIDATORS,这对于创建用户来说效果很好——我只需要用这个正则表达式 r'^[\w\.@+\- ]+$' 定义一个验证器并将设置指向它。

问题是,如果我尝试在管理员中编辑现有用户(例如授予他们权限),我会在保存时收到错误消息,提示用户名字段因空格而无效。我已经从 django docs:

中尝试了一些类似这种方法的方法
from django.contrib.auth.models import User
from django.contrib.auth.validators import UnicodeUsernameValidator

class MyValidator(UnicodeUsernameValidator):
    regex = r'^[\w\.@+\- ]+$'

class MyUser(User):
    username_validator = MyValidator()

class Meta:
    proxy = True  

而且我还尝试覆盖 admin.py 中的 UserChangeForm:

class MyUserChangeForm(UserChangeForm):
    username = forms.RegexField(
        label='Username',
        max_length=30,
        regex=r'^[\w\.@+\- ]+$',
        help_text = 'Required. 30 characters or fewer. Alphanumeric characters only (letters, digits, hyphens and underscores).')


class CustomUserAdmin(UserAdmin):
    form = MyUserChangeForm

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

但两者都不走运。我没有收到任何错误,但我仍然无法将更改保存到用户名中有空格的用户。我忍不住觉得我错过了一些愚蠢的东西,从其他答案看来这应该是相当简单的。

似乎基于这个 bug report username_validator 设置没有按预期工作 - 虽然那个错误是旧的并且 2.0 的文档仍然提供这个方法,我假设它还没有修复,因为我已经尝试了一切。

最终我会硬着头皮迁移到自定义用户模型,我应该从一开始就完成它但幸运的是我只是将 django all-auth 作为我的独家登录方法并计划无论如何都要删除现有用户,所以希望迁移不会太麻烦。

编辑:对于遇到此问题的任何其他人,我强烈建议切换到自定义用户模型。在项目中期切换并不像文档听起来那么可怕。