繁体   English   中英

Django Unleashed Cp.22:FieldError:为用户指定了未知字段(用户名)

[英]Django Unleashed Cp.22: FieldError: Unknown field(s) (username) specified for User

我正在阅读有关Django(Django Unleashed)的教程,并且我认为在使用较新版本的Django时代码存在问题(我也已经在亚马逊上阅读了有关此章的问题)。 因此,对于本书的未来学生,我会公开问及与本书有关的问题。

为了创建自定义用户模型,本书建议使用不包含“用户名”字段的用户模型。 makemigrations期间makemigrations此错误:

django.core.exceptions.FieldError: Unknown field(s) (username) specified for User

关于StackOverflow上的此错误,还有其他主题,它们建议django.contrib.auth.admin.UserAdmin需要指定的“用户名”,因此建议将名为add_fieldsets的属性添加到继承自UserAdmin的类中。 我的问题(因此,在遇到其他问题时,我不必超前本书中的代码)...是否可以在不指定用户名和没有admin类的情况下创建自定义用户个人资料? 到目前为止,这是我的代码:

用户模型

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField('email adress', max_length=254, unique=True)
    is_staff = models.BooleanField('staff status', default=False)
    is_active = models.BooleanField('active', default=False)
    name = models.CharField(max_length=255)
    joined = models.DateTimeField("Date Joined", auto_now_add=True)

    USERNAME_FIELD = 'email'
    objects = UserManager()

    def __str__(self):
        return self.email

    def get_absolute_url(self):
        return self.profile.get_absolute_url()

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.profile.name

用户经理

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(
            self, email, password, **kwargs):
        email = self.normalize_email(email)
        is_staff = kwargs.pop('is_staff', False)
        is_superuser = kwargs.pop(
            'is_superuser', False)
        user = self.model(
            email=email,
            is_active=True,
            is_staff=is_staff,
            is_superuser=is_superuser,
            **kwargs)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(
            self, email, password=None,
            **extra_fields):
        return self._create_user(
            email, password, **extra_fields)

    def create_superuser(
            self, email, password,
            **extra_fields):
        return self._create_user(
            email, password,
            is_staff=True, is_superuser=True,
            **extra_fields)

而且我想执行makemigrations而不会出现错误

我认为您需要使用AbstractUser而不是AbstractBaseUser

class User(AbstractUser, PermissionsMixin):

或需要为模型声明username ,例如:

username = models.CharField(_('username'), max_length=30, unique=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM