为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

天涯尽头无女友 2022-07-12 10:20:08
似乎这不是一个独特的问题,但我在解决方案中遗漏了一些东西。我正在使用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
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

这不起作用的原因是该create_user函数显式过滤 的内容以仅包含在setting中指定的details键。这默认为USER_FIELDS

USER_FIELDS = ['username', 'email']

所以其他任何东西都被忽略了。它似乎没有记录,但您应该能够通过创建如下设置来覆盖它:

SOCIAL_AUTH_USER_FIELDS = ['username', 'email', 'role']

这将确保您role被传递到用户实例。

您的管道和配置的其余部分看起来不错。


查看完整回答
反对 回复 2022-07-12
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信