Django用户模型用户名(unique=False)

6
我看过许多解决方案,但似乎没有一个能够回答这个问题。
我当前的用户模型正在使用AbstractUser。有没有办法使username(unique = False)呢?
因为我想允许用户拥有相同的用户名,因为我使用的登录方式是通过电子邮件地址和密码。
以下是我尝试过但不起作用的代码:
class MyUser(AbstractUser):
    username = models.CharField(max_length=30, unique=False)

错误:

customuser.MyUser: (auth.E003) 'MyUser.username' 必须是唯一的,因为它被命名为 'USERNAME_FIELD'


这个能帮到你的需求吗:https://dev59.com/RFoU5IYBdhLWcg3wjHhL? - bonidjukic
@bonidjukic 我已经可以使用电子邮件登录了。我只需要将用户名唯一设置为false即可。就这样。 - Jin Nii Sama
你的代码应该是可以工作的。你是否更新了设置,指示Django使用你的自定义“User”模型? - shad0w_wa1k3r
1
customuser.MyUser:(auth.E003)'MyUser.username'必须是唯一的,因为它被命名为“USERNAME_FIELD”。这是我得到的错误。 - Jin Nii Sama
你应该将这个错误添加到你的问题中,这样会更加清晰明了。 - shad0w_wa1k3r
4个回答

3

2
尝试使用USERNAME_FIELD属性将电子邮件指定为用户名字段:
class MyUser(AbstractUser):
    username = models.CharField(max_length=30, unique=False)
    USERNAME_FIELD = 'email'

如果 unique=False,那么整个唯一电子邮件验证都会被破坏。 - Jin Nii Sama
电子邮件必须是唯一的,我只想将用户名唯一更改为false。 - Jin Nii Sama

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

请简要解释一下你的答案。 - Mehrdad Pedramfar
@MehrdadPedramfar 我不了解他的代码,所以我只想提供一些与他的代码相关的信息,而且我不想在其中添加任何额外的内容...... 他正在继承AbstractUser类,因此该用户名字段将直接对Django用户名字段产生影响.... 就是这样 - Nikhil Bhardwaj

1

如果使用自定义用户类并且使用Django本身的身份验证后端,则可以实现此功能:

  1. 基于 Abstract User 类创建一个自定义用户类:

     from django.contrib.auth.models import AbstractUser
    
     class CustomUser(AbstractUser):
         username = models.CharField(_("username"), max_length=254, unique=False)
         email = models.EmailField(_("email"), max_length=254, unique=True)
    
         USERNAME_FIELD = "email"
         REQUIRED_FIELDS = ["username"]
    
         objects = CustomUserManager()
    
         def __str__(self):
           return self.username
    
  2. 按照以下 https://docs.djangoproject.com/en/4.1/topics/auth/customizing/#writing-a-manager-for-a-custom-user-model 的说明,创建一个自定义用户管理器类。

  3. 在 bash 中运行以下命令以更新 SQL 数据库配置:

     manage.py makemigrations
     manage.py migrate
    

现在应该将用户名字段识别为非唯一的,而电子邮件是唯一键标识符。

希望这可以帮到你!

MK。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接