【问题标题】:Django Unleashed Cp.22: FieldError: Unknown field(s) (username) specified for UserDjango Unleashed Cp.22:FieldError:为用户指定的未知字段(用户名)
【发布时间】:2018-02-27 02:21:14
【问题描述】:

我正在关注 Django (Django Unleashed) 的教程书,我认为在使用较新版本的 Django 时代码存在问题(我也在 amazon 上阅读过有关此章节的问题)。因此,对于本书的未来学生,我会公开地提出与本书相关的问题。

对于创建自定义用户模型,本书建议使用没有“用户名”字段的用户模型。在makemigrations 期间发生此错误:

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

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

用户模型

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 没有错误

【问题讨论】:

  • 如果您“认为[本书的]代码有问题”,您需要提供有问题的代码。并不是所有的读者都把那本书放在他们的桌子上。否则,“与本书的代码有关”的问题很难回答。
  • 这里是项目的整个分支,与出现错误消息的位置完全相同。 github.com/jambonrose/DjangoUnleashed-1.8/tree/…

标签: python django django-models


【解决方案1】:

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

class User(AbstractUser, PermissionsMixin):

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

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

【讨论】:

  • 好的,我会在继续学习的过程中记住这个解决方案。但我不认为使用 AbstractUser 是该项目的意图,尽管我确实认为可以使用您的解决方案创建所需的行为。
猜你喜欢
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多