【问题标题】:Django user model username (unique=False)Django 用户模型用户名(唯一=假)
【发布时间】:2018-07-30 14:43:02
【问题描述】:

我已经看过很多解决方案,但似乎都没有回答这个问题。

我的用户模型现在正在使用 AbstractUser。有没有办法让用户名(唯一=假)

因为我想让用户能够拥有相同用户名的重复,因为我正在使用的登录是通过电子邮件地址和密码

下面是我试过但不起作用的代码。

代码:

class MyUser(AbstractUser):
    username = models.CharField(max_length=30, unique=False)

错误:

customuser.MyUser: (auth.E003) 'MyUser.username' must be unique because it is named as the 'USERNAME_FI ELD'

【问题讨论】:

  • 这对您正在尝试做的事情有帮助吗:stackoverflow.com/questions/37332190/django-login-with-email?
  • @bonidjukic 我已经可以使用电子邮件登录了。我只需要使用户名唯一=假。就是这样
  • 您拥有的代码应该可以工作。您是否更新了设置以指示 Django 使用您的自定义 User 模型?
  • customuser.MyUser: (auth.E003) 'MyUser.username' must be unique because it is named as the 'USERNAME_FI ELD'. 这是我得到的错误
  • 您应该将该错误添加到您的问题中,这样会更清楚。

标签: python django


【解决方案1】:

如果您使用可以支持的自定义身份验证后端,则允许使用非唯一的用户名字段。

如果你想使用 django 的默认身份验证后端,你不能让用户名非唯一。

您必须为自定义后端实现一个具有 get_user(user_id) 和 authenticate(request, **credentials) 方法的类。

您可以在此处的文档中阅读它。 https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#specifying-custom-user-model

【讨论】:

    【解决方案2】:
    class MyUser(AbstractUser):
        username = models.CharField(max_length=30, unique=False)
        email = models.EmailField(max_length=255, unique=True)
        USERNAME_FIELD = 'email'
    

    【讨论】:

    • 请解释一下你的答案。
    • 您正在继承 AbstractUser 类,但如果您使用的是 2.0 >= django 的更高版本,您应该继承 AbstractBaseUser 类而不是这个。如果您想了解更多信息,请查看codingforentrepreneurs.com/blog/…
    • @MehrdadPedramfar 我不了解他的代码,所以我只想提供一些与他的代码相关的信息,我不想在其中添加其他内容.....而且他正在继承AbstractUser 类,用户名字段将直接对 Django 用户名字段产生影响......就是这样
    【解决方案3】:

    尝试使用USERNAME_FIELD 属性将电子邮件指定为用户名字段:

    class MyUser(AbstractUser):
        username = models.CharField(max_length=30, unique=False)
        USERNAME_FIELD = 'email'
    

    【讨论】:

    • 那么 unique=False 会破坏唯一电子邮件的整个验证
    • 电子邮件必须是唯一的,只是想将用户名唯一更改为假。
    猜你喜欢
    • 2017-02-02
    • 2015-05-22
    • 1970-01-01
    • 2013-09-17
    • 2018-01-19
    • 2010-11-21
    • 2019-11-03
    • 2020-11-02
    • 2017-11-12
    相关资源
    最近更新 更多