使用自定义用户模型和 UserManager 使用 python-social-auth

似乎这不是一个独特的问题,但我在解决方案中遗漏了一些东西。我正在使用python-social-authGoogle 并登录。一切似乎都很顺利,直到它进入create_user管道的一部分。我确实有一个自定义用户模型和 UserManager。在我的 User 模型上,我确实有一个role与某些choices. 当社交身份验证启动并让某人登录时,它会调用create_user我的用户管理器,但它只是传递电子邮件,没有其他字段。我试图role通过将其添加到社交身份验证字典来连接到管道并添加所需的属性details,但这似乎没有任何效果。我应该如何挂钩到 create user 属性以添加就社交身份验证而言不存在的字段?


用户模型


class User(AbstractBaseUser, PermissionsMixin):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    is_staff = models.BooleanField(default=False)

    is_active = models.BooleanField(default=True)

    date_joined = models.DateTimeField(default=timezone.now)

    email = models.EmailField(_("email address"), unique=True)

    first_name = models.CharField(max_length=240, blank=True)

    last_name = models.CharField(max_length=240, blank=True)

    role = models.IntegerField(choices=RoleChoices.choices)


    USERNAME_FIELD = "email"

    REQUIRED_FIELDS = []


    objects = UserManager()


    def __str__(self):

        return self.email


    @property

    def full_name(self):

        return f"{self.first_name} {self.last_name}".strip()


我的用户管理器:


class UserManager(BaseUserManager):

    """

    Custom user model manager where email is the unique identifiers

    for authentication instead of usernames.

    """


    def create_user(self, email, password, **extra_fields):

        """

        Create and save a User with the given email and password.

        """

        if not email:

            raise ValueError(_("The Email must be set"))


        email = self.normalize_email(email)

        user = self.model(email=email, **extra_fields)


        if password is not None:

            user.set_password(password)


        user.save()

        return user


天涯尽头无女友
浏览 127回答 1
1回答

小怪兽爱吃肉

这不起作用的原因是该create_user函数显式过滤 的内容以仅包含在setting中指定的details键。这默认为USER_FIELDSUSER_FIELDS = ['username', 'email']所以其他任何东西都被忽略了。它似乎没有记录,但您应该能够通过创建如下设置来覆盖它:SOCIAL_AUTH_USER_FIELDS = ['username', 'email', 'role']这将确保您role被传递到用户实例。您的管道和配置的其余部分看起来不错。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python