Django create_superuser()缺少1个必需的位置参数:“用户名”

时间:2019-12-12 17:43:02

标签: django django-models django-authentication

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

# Create your models here.

class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('user must have smartcard')
        if not username:
            raise ValueError('must have username')

        user = self.create_user(
            email=self.normalize_email(email),
            username=username,

        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            username=username,
        )
        user.is_admin =True
        user.is_staff =True
        user.is_superuser=True
        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):

    username = models.CharField(max_length=100, unique=True)

    email = models.EmailField(verbose_name="email", max_length=30, unique=True)
    department = models.CharField(max_length=30, choices=DEPARTMENT)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELD = ['username',]

    objects=MyAccountManager()

    def __str__(self):
        return self.email   

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True   

我无法理解是什么错误。

在创建超级用户时,提示不会要求我输入用户名

我也修改了settings.py文件。 在各种数据库中尝试了几次。 我还在REQUIRED_FIELDS部分添加了用户名。

2 个答案:

答案 0 :(得分:0)

欢迎来到@Omkar。

您只需要将字段REQUIRED_FIELD更改为REQUIRED_FIELDS

REQUIRED_FIELDS = ['username']

您可以在docs上对其进行检查。

答案 1 :(得分:0)

@Omkar Kale ,请查看您的方法:

7.4.1 OSS

请更改它:

def create_superuser(self, email, username, password):
    user = self.create_user(
        email=self.normalize_email(email),
        password=password,
        username=username,
    )

看,您需要根据参数传递值。所以

  • 第一:用户名
  • :电子邮件
  • 第三密码。

然后,您将不再会收到位置参数错误。您必须根据参数的位置传递它们。