create_user()缺少一个必需的位置参数:'username'。

3

我删除了username字段,因为我希望用户能够使用他们的电子邮件地址登录,所以在我的models.py文件中有以下内容:

class CustomUser(AbstractUser):
    USER_TYPE = ((1, 'HOD'), (2, 'Staff'), (3, 'Student'))
    username = None
    email = models.EmailField(unique=True)
    user_type = models.CharField(default=1, choices=USER_TYPE, max_length=1)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []


class Student(models.Model):
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    gender = models.CharField(max_length=1, choices=GENDER)
    address = models.TextField()
    profile_pic = models.ImageField(upload_to='media')
    session_start_year = models.DateField(null=True)
    session_end_year = models.DateField(null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)


在我的views.py文件中,我尝试了以下内容:
user = CustomUser.objects.create_user(email=email, password=password, user_type=3, first_name=first_name, last_name=last_name)

但是我得到了一个错误信息:create_user()缺少1个必需的位置参数:'username' 我该如何修复它?


create_user() 需要第一个参数作为用户名。你没有传递这个参数。 - John Gordon
我从我的模型中删除了username。我尝试传递username=None,但它显示必须设置给定的用户名。我该如何绕过这个问题?我不想保留username字段。对我来说,只有电子邮件就可以了。 - Owonubi Job Sunday
1个回答

5

您需要编写一个Django-doc中的自定义用户模型管理器来重新实现create_user方法。

因此,您可以实现一个CustomUserManager

from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import UserManager

class <b>CustomUserManager</b>(UserManager):

    def _create_user(self, email, password, **extra_fields):
        email = self.normalize_email(email)
        user = CustomUser(email=email, **extra_fields)
        user<b>.password = make_password(password)</b>
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        assert extra_fields['is_staff']
        assert extra_fields['is_superuser']
        return self._create_user(email, password, **extra_fields)

class CustomUser(AbstractUser):
    # …

    <b>objects = CustomUserManager()</b>

然后将此管理器注册为objects管理器。


我刚刚尝试了一下,但是出现了name 'make_password' is not defined的错误。我该如何修复这个问题? - Owonubi Job Sunday
@OwonubiJobSunday: 你可以使用以下代码导入 from django.contrib.auth.hashers import make_password - Willem Van Onsem
你能解释一下我们在这里做的事情吗?为什么在默认模式下用户名是必填项,而在这里却是可选的? - Alexander
嗨@WillemVanOnsem!我在尝试像你一样使用代码,但出现了错误:TypeError: BaseManager.all()缺少一个必需的位置参数:'self'。 - Kev
1
@HuyNguyen:你是怎么使用这个管理器的?你确定在 objects = CustomUserManager() 的末尾添加了括号吗? - Willem Van Onsem

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