类型错误:create_superuser()缺少一个必需的位置参数:'profile_picture'。

18

在添加profile_picture字段后,我收到以下错误:

TypeError: create_superuser() missing 1 required positional argument: 'profile_picture'

这个profile_picture字段是一个"ImageField",设置为"Null = True"。

我尝试了以下方法:def create_user(...., profile_picture=None, ....)。但它没有起作用。

错误仅在命令提示符中创建超级用户时发生。

这是我的models.py文件:

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser


class UserManager(BaseUserManager):
    def create_user(self, email, full_name, profile_picture=None, gender=None, password=None, is_admin=False, is_staff=False, is_active=True):
        if not email:
            raise ValueError("User must have an email")
        if not password:
            raise ValueError("User must have a password")
        if not full_name:
            raise ValueError("User must have a full name")

        user = self.model(
            email=self.normalize_email(email)
        )
        user.full_name = full_name
        user.set_password(password)  # change password to hash
        # user.profile_picture = profile_picture
        user.gender = gender
        user.admin = is_admin
        user.profile_picture = profile_picture
        user.staff = is_staff
        user.active = is_active
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, profile_picture, gender, full_name, password=None):
        user = self.create_user(
            email,
            full_name,
            profile_picture,
            gender,
            password=password,
            is_staff=True,
        )
        return user

    def create_superuser(self, email, profile_picture, gender, full_name, password=None):
        user = self.create_user(
            email,
            full_name,
            profile_picture,
            gender,
            password=password,
            is_staff=True,
            is_admin=True,
        )
        return user


class User(AbstractBaseUser):
    username = models.CharField(max_length=255)
    full_name = models.CharField(max_length=255)
    email = models.EmailField(max_length=255, unique=True,)
    profile_picture = models.ImageField(upload_to='user_data/profile_picture', null=True, blank=True)
    gender = models.CharField(max_length=255, blank=True, default='rather_not_say')
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)  # a admin user; non super-user
    admin = models.BooleanField(default=False)  # a superuser
    # notice the absence of a "Password field", that's built in.

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name', 'gender']  # Email & Password are required by default.

    objects = UserManager()

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
         # The user is identified by their email address
         return self.email

    def __str__(self):              # __unicode__ on Python 2
         return self.email

    @staticmethod
    def has_perm(perm, obj=None):
         # "Does the user have a specific permission?"
         # Simplest possible answer: Yes, always
        return True

    @staticmethod
    def has_module_perms(app_label):
         # "Does the user have permissions to view the app `app_label`?"
         # Simplest possible answer: Yes, always
         return True

    @property
    def is_staff(self):
         # "Is the user a member of staff?"
         return self.staff

    @property
    def is_admin(self):
         # "Is the user a admin member?"
         return self.admin

    @property
    def is_active(self):
         # "Is the user active?"
         return self.active

这个回答解决了你的问题吗?在实现自定义用户模型时使用createsuperuser出现问题 - aaron
10个回答

22

你可以将username添加到REQUIRED_FIELDS中。之后,python manage.py createsuperuser会要求输入用户名字段,并且它会起作用。

REQUIRED_FIELDS = ['full_name', 'gender', 'username',]

17

好的,你还需要创建create_superuser函数:

class UserManager(BaseUserManager):
    def create_user(self, email, full_name, profile_picture, password=None, is_admin=False, is_staff=False, is_active=True):
        if not email:
            raise ValueError("User must have an email")
        if not password:
            raise ValueError("User must have a password")
        if not full_name:
            raise ValueError("User must have a full name")

        user = self.model(
            email=self.normalize_email(email)
        )
        user.full_name = full_name
        user.set_password(password)  # change password to hash
        user.profile_picture = profile_picture
        user.admin = is_admin
        user.staff = is_staff
        user.active = is_active
        user.save(using=self._db)
        return user
        
    def create_superuser(self, email, full_name, profile_picture, password=None, **extra_fields):
        if not email:
            raise ValueError("User must have an email")
        if not password:
            raise ValueError("User must have a password")
        if not full_name:
            raise ValueError("User must have a full name")

        user = self.model(
            email=self.normalize_email(email)
        )
        user.full_name = full_name
        user.set_password(password)
        user.profile_picture = profile_picture
        user.admin = True
        user.staff = True
        user.active = True
        user.save(using=self._db)
        return user

祝你好运!


就像我之前说的那样,它已经存在了,并且还有一个create_superuser函数,请您检查一下我的编辑代码。现在models.py中的代码已经在上面了。 - Ankush paul
1
我已经想办法解决了,麻烦您修改一下您的代码帖子。感谢您的所有帮助,希望您能继续做出更多贡献。再次感谢 :) - Ankush paul

4

我有同样的问题,后来发现REQUIRED_FIELDS列表中的名称错了。该列表告诉django框架在创建时要求提供姓名。由于它没有要求,并且你已经将其变为必填项。希望这有所帮助,祝你好运。


4

我通过一些更改解决了这个问题

我的旧代码

class User(AbstractUser):
    username = None
    name = models.CharField(max_length=200, null=True)
    email = models.EmailField(unique=True, null=True)
    bio = models.TextField(null=True)

    avatar = models.ImageField(null=True, default="avatar.svg")
 
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

我将用户名字段编辑为电子邮件字段。

class User(AbstractUser):
    username = models.EmailField(unique=True, null=True)
    name = models.CharField(max_length=200, null=True)
    bio = models.TextField(null=True)

    avatar = models.ImageField(null=True, default="avatar.svg")
 
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

更改如下:

username = None => username = models.EmailField(unique=True, null=True)

愉快的编码 :)


2

您需要在"models.py"中的"User(AbstractBaseUser)"类的"REQUIRED_FIELDS"中添加"profile_picture"

# "models.py"
class User(AbstractBaseUser):
    # ...                           # Here
    REQUIRED_FIELDS = ['full_name', 'profile_picture', 'gender']
    # ...

1
你需要在models.py中的User(AbstractBaseUser)类中将profile_picture添加到REQUIRED_FIELDS中:

1
最好在migrations文件夹中的0001.initial.py文件中创建一个类。定义一个包含所有登录所需字段的类,并提供空依赖和操作块。就这样。

1
在迁移文件夹中创建一个名为 0001_initial.py 的文件,然后按照下面的代码进行操作,它会起作用...
from django.db import migrations
from api.user.models import CustomUser

class Migration(migrations.Migration):
    
    def seed_data(apps, schema_editor):
        user = CustomUser(name='name',
                          email='mail@gmail.com',
                          is_staff=True,
                          is_superuser=True,
                          phone='987654321',
                          gender='Male'
        
                        )
        user.set_password('anypassword')
        user.save()
    
    

    dependencies=[

    ]

    operations=[
            migrations.RunPython(seed_data),
        ]

1
这是硬编码。这绝不是一个好的方法。但我不会点踩。 - emanuel sanga

1
class UserData(AbstractUser):
    UserDataid = models.AutoField(primary_key=True)
    _name = models.CharField(max_length=255)
    email = models.CharField(max_length=255, unique=True)
    password = models.CharField(max_length=255)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

我曾经有一个类似的模型出现了相似的错误,只需要将"username"添加到REQUIRED_FIELDS中就可以了!

1
实际上,在create_user函数中,你正在将profile_picture参数设为可选。
 def create_user(self, email, full_name, profile_picture=None, gender=None, password=None, is_admin=False, is_staff=False, is_active=True):

而对于create_superuser函数,你的代码是:
 def create_superuser(self, email, profile_picture, gender, full_name, password=None):

解决方案:
 def create_superuser(self, full_name, email, password, profile_picture=None, gender=None, is_admin=True, is_staff=True, is_active=True):

有一个快捷方式可以处理这么多参数:
def create_superuser(self, email, password, **extra_fields):

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