繁体   English   中英

django.core.exceptions.FieldDoesNotExist:用户没有名为“用户名”的字段

[英]django.core.exceptions.FieldDoesNotExist: User has no field named 'username'

我正在尝试自定义 Django 的 AbstractUser。 当我尝试将username重置为None时,出现以下异常:

"django.core.exceptions.FieldDoesNotExist: User has no field named 'username'".

这是我的代码:

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError("L'adresse e-mail donnée doit etre definie")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password, **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, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True")
        return self._create_user(email, password, **extra_fields)


class User(AbstractUser):
    username = None
    email = models.EmailField('email adress', unique=True)
    telephone = models.CharField(max_length=20)
    REQUIRED_FIELDS = []

我该怎么做才能解决这个问题?

如果您在项目中使用 django-allauth,这也可能导致。要解决此问题,您需要在 settings.py 中将 ACCOUNT_USER_MODEL_USERNAME_FIELD 定义为 None。 有关更多信息,请参阅此问题allauth 文档

ACCOUNT_USER_MODEL_USERNAME_FIELD = None

您尚未在代码中为USERNAME_FIELD设置值。 这必须设置为唯一标识用户实例的字段。 AbstractUser将其设置为'username' ,因此您会收到错误消息。 您可以将其设置为'email'来解决您的问题:

class User(AbstractUser):
    username = None
    email = models.EmailField('email adress', unique=True)
    telephone = models.CharField(max_length=20)
    # set below value
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

将用户名设置为无的原因是什么?

用户模型必须具有唯一字段,如用户名或电子邮件或电话号码以识别用户。

如果您想覆盖用户的模型,您应该提供这样的唯一字段,将其标记为用户名字段并设置 django 设置变量 AUTH_USER_MODEL 定义您的自定义模型。

像这样的东西:


# model
class User(AbstractUser):
    username = models.CharField(max_length=32, unique=True)  # or something else
    ...

    USERNAME_FIELD = 'username'


# settings
AUTH_USER_MODEL = 'users.User'

如我所见,您想使用 email 进行身份验证:

正如文档所说 [https://django-allauth.readthedocs.io/en/latest/configuration.html]

你必须在设置文件中添加

ACCOUNT_AUTHENTICATION_METHOD ="email"

但首先你必须添加到你的 model

class User(AbstractUser):
    username = None
    email = models.EmailField('email adress', unique=True)
    telephone = models.CharField(max_length=20)
    REQUIRED_FIELDS = []
    USERNAME_FIELD = "email"

暂无
暂无

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

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