【问题标题】:How to change the field of username to user_name in to django custom user model?如何将用户名字段更改为 django 自定义用户模型中的 user_name?
【发布时间】:2021-12-31 10:23:36
【问题描述】:

我创建了自定义用户模型。现在我想使用user_name 作为用户名字段而不是username。如下面的代码 sn-p 所示。

class CustomUser(AbstractBaseUser):
    
    username_validator = UnicodeUsernameValidator()

    user_name = models.CharField(
        _('username'),
        max_length=100,
        unique=True,
        help_text=_('Required. 100 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    USERNAME_FIELD = 'user_name'

我无法做到这一点。我遇到以下错误:

SystemCheckError: System check identified some issues:
ERRORS:
<class 'accounts.admin.CustomUserAdmin'>: (admin.E033) The value of 'ordering[0]' refers to 'username', which is not an attribute of 'accounts.CustomUser'.
<class 'accounts.admin.CustomUserAdmin'>: (admin.E108) The value of 'list_display[0]' refers to 'username', which is not a callable, an attribute of 'CustomUserAdmin', or an attribute or method on 'accounts.CustomUser'

之所以使用这个,是因为项目的所有数据库表约定都是这样的。如果我可以定义字段名称是数据库,就像我们对 Meta 类中的表所做的那样,如下所示。我将我的 customuser 模型称为 db 中的用户模型。

class Meta:
        db_table = "user"

有没有这样调用表字段的方法?

class Meta:
            db_table_user_name = "username"

如果可能的话,我们不需要将username 更改为user_name。我们可以直接调用用户名字段等于数据库中的用户名。当且仅当 django 模型有可能。

【问题讨论】:

    标签: python django django-models abstract-class django-users


    【解决方案1】:

    在您注册用户模型的 admin.py 中。您正在向 ModelAdmin 注册它,并且在该 ModelAdmion 中您错误地命名了字段。也将其更改为 user_name。

    【讨论】:

    • 兄弟 我可以更改数据库中字段的标签,以便模型字段仍然保留用户名,但我将其标记为数据库的用户名吗?
    • 您可以使用 verbose_name 参数,如果这是您要查找的内容 name = models.CharField(max_length=200, verbose_name="Nom")
    • 兄弟还有一件事.. 你可以看到它是我的 abstractbaseuser 类。现在我得到了最后一个登录字段,但我不想要那个.. 我怎样才能删除它?
    • 从 admin.py 中的 CustomUserAdmin 中删除最后一个登录字段
    • 我没有在管理员中使用它class CustomUserAdmin(admin.ModelAdmin): add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'password1', 'password2'), }), ) list_display = ('username', 'email', 'is_staff') search_fields = ('username', 'email') ordering = ('username',)
    【解决方案2】:

    在您的情况下,您不需要更改字段名称,只需使用 db_column='user_name' 参数和参数覆盖 username 字段:

    class CustomUser(AbstractBaseUser):
        username_validator = UnicodeUsernameValidator()
    
        username = models.CharField(
            _('username'),
            max_length=150,
            unique=True,
            help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
            db_column='user_name'  # <------------------------
            validators=[username_validator],
            error_messages={
                'unique': _("A user with that username already exists."),
            },
        )
    

    Django doc refrence

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2021-04-15
      • 2014-03-01
      • 2021-12-08
      • 1970-01-01
      • 2018-12-01
      • 2018-05-13
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多