gpt4 book ai didi

python - 如何在 Django 中覆盖用户名 max_length ?

转载 作者:行者123 更新时间:2023-12-01 09:02:22 24 4
gpt4 key购买 nike

我使用的是 Django 1.9,其中用户名的字符数限制为 30 个。为了克服这个问题,我创建了一个自定义用户模型,如下所示:

class User(AbstractUser):
pass

# Override username max_length to allow long usernames.
User._meta.get_field('username').max_length = 255
User._meta.get_field('username').help_text = _(
'Required. 255 characters or fewer. Letters, digits and @/./+/-/_ only.')

在 shell 中,我可以创建名称超过 30 个字符的用户,但在管理中,我无法添加具有长用户名的用户或将长用户名分配给现有用户。我得到:

Ensure this value has at most 30 characters (it has 43).

我注意到 Django Admin 的 UserCreateForm 和 UserChangeForm 在其 Meta 选项中显式设置了 Django 的默认用户模型(不应该是这样,有一个关于此的 ticket ),所以我使用了这样的自定义表单:

from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

User = get_user_model()


class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = User


class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = User


class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm
add_form = CustomUserCreationForm

还是没用。因此,在调用 super 之后,我在 CustomUserChangeForm 的 init 中添加了一个断点,我得到:

ipdb> self
<UserForm bound=True, valid=False, fields=(username;password;first_name;last_name;email;is_active;is_staff;is_superuser;groups;user_permissions)>
ipdb> self._meta.model
<class 'custom.models.User'>
ipdb> self.fields['username'].max_length
255
ipdb> self.fields['username'].validators[0].limit_value
255
ipdb> self.fields['username'].clean('a_username_with_more_than_thirty_characters')
u'a_username_with_more_than_thirty_characters'
ipdb> self.errors
{'username': [u'Ensure this value has at most 30 characters (it has 38).']}

我心都碎了。我不知道我可能会错过什么。有什么想法吗?

最佳答案

好的,我知道问题出在哪里了。当 Django 的默认 username 字段被实例化时,它会将 MaxLengthValidator 添加到其验证器列表中,并使用 max_length 参数来设置其 limit_value 。当我猴子修补 User 类时,我覆盖了 username 字段的 max_lengthhelp_text,但我没有处理验证器。在我的自定义用户类下添加此行修复了问题:

User._meta.get_field('username').validators[1].limit_value = 255

我花费在调试上的时间可能很好地说明了猴子修补通常是一个坏主意。

关于python - 如何在 Django 中覆盖用户名 max_length ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52371384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com