Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中覆盖用户名最大长度?_Python_Django_Django Forms_Django Admin - Fatal编程技术网

Python 如何在Django中覆盖用户名最大长度?

Python 如何在Django中覆盖用户名最大长度?,python,django,django-forms,django-admin,Python,Django,Django Forms,Django Admin,我使用的是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 = _( 'R

我使用的是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个字符的用户,但在admin中,我不能添加具有长用户名的用户,也不能将长用户名分配给现有用户。我得到:

确保此值最多包含30个字符(43个字符)

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

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).']}
ipdb>self
ipdb>self.\u元模型
ipdb>self.fields['username'].最大长度
255
ipdb>self.fields['username']。验证器[0]。限制值
255
ipdb>self.fields['username'].clean('a_username_,包含超过\u三十个字符')
u'a_用户名_超过_三十个字符'
ipdb>self.errors
{'username':[u'确保此值最多包含30个字符(它有38个)。]}

我真是疯了。我不知道我可能会错过什么。有什么想法吗?

换句话说,您可以在
AbstractBaseUser
中使用自己的自定义模型和字段

from django.contrib.auth.models import AbstractBaseUser

class User(AbstractBaseUser):
    my_new_username = models.CharField(unique=True, max_length=50, verbose_name="Username")

    USERNAME_FIELD = 'my_new_username'

并解释了
AbstractBaseUser
AbstractUser
之间的区别。还有一个可能对您有所帮助。

好的,我发现了问题所在。当Django的默认
username
字段被实例化时,它会将
MaxLengthValidator
添加到它的验证器列表中,并使用
max_length
参数设置它的
limit_值。当我对User类进行monkey修补时,我重写了
username
字段的
max_length
help_text
,但我没有处理验证程序。在我的自定义用户类下添加此行修复了以下问题:

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

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

您是否设置了
AUTH\u USER\u MODEL
设置?是的,我在调试器中检查了表单使用的模型是否正确。我编辑了这个问题并添加了这个检查。我知道,但是通过所有的配置,显式地配置Django以使用默认值,这样我就可以更改用户名的最大长度……这就是为什么我更喜欢直接从AbstractUser继承。我不明白为什么它不应该像我那样工作。