首页 > 解决方案 > Django 在 UserChangeForm 中允许用户名中有空格

问题描述

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

首先:我网站上的注册/登录完全是通过 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)

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

标签: pythondjangodjango-authenticationdjango-allauthdjango-users

解决方案


根据这个错误报告,username_validator 设置似乎没有按预期工作 - 尽管该错误是旧的并且 2.0 的文档仍然提供此方法,但我假设它还没有得到修复,因为我已经尝试了一切。

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

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


推荐阅读