如何用django allauth提供程序信息填充用户配置文件?

如何用django allauth提供程序信息填充用户配置文件?,django,facebook,authentication,django-allauth,Django,Facebook,Authentication,Django Allauth,我正在使用django allauth作为身份验证系统。我需要的是,当用户登录时,profile模块将填充提供商信息(在我的例子中是facebook) 我试图使用pre_social_登录信号,但我不知道如何从提供者auth检索数据 from django.dispatch import receiver from allauth.socialaccount.signals import pre_social_login @receiver(pre_social_login) def pop

我正在使用django allauth作为身份验证系统。我需要的是,当用户登录时,profile模块将填充提供商信息(在我的例子中是facebook)

我试图使用pre_social_登录信号,但我不知道如何从提供者auth检索数据

from django.dispatch import receiver
from allauth.socialaccount.signals import pre_social_login

@receiver(pre_social_login)

def populate_profile(sender, **kwargs):
    u = UserProfile( >>FACEBOOK_DATA<< )
    u.save()
来自django.dispatch导入接收方
从allauth.socialaccount.signals导入预社交登录
@接收人(预社交登录)
def填充_配置文件(发送方,**kwargs):

u=UserProfile(>>FACEBOOK\u DATA用户成功登录后发送
pre\u social\u login
信号 通过社交提供商进行身份验证,但在实际登录之前 已处理。此信号用于社交登录、注册和 将其他社会帐户连接到帐户

因此,它是在注册完全完成之前发送的——因此这不是合适的信号

相反,我建议您使用
allauth.account.signals.user\u signed\u注册
,它为所有用户、本地用户和社交用户发出

在该处理程序中,您可以检查附加到用户的任何
SocialAccount
。例如,如果要检查Google+特定数据,请执行以下操作:

user.socialaccount_set.filter(provider='google')[0].extra_data

更新:最新的开发版本通过传递一个直接包含所有相关信息(社交帐户、代币等)的
sociallogin
参数,使这一点更加方便。

我正在以图片(字段)url和谷歌提供商(字段)为例,这样做

socialaccount_obj = SocialAccount.objects.filter(provider='google', user_id=self.user.id)
   picture = "not available"
   if len(socialaccount_obj):
            picture = socialaccount_obj[0].extra_data['picture']

确保导入:从allauth.socialaccount.models导入socialaccount

以下是@solution:的一个具体示例

假设您的配置文件模型有以下3个字段:
名字
电子邮件
图片url

视图。py:

如果您对每个提供者中的
picture\u url
变量感到困惑,请查看文档:

facebook:

picture\u url=”http://graph.facebook.com/“+sociallogin.account.uid+”/picture?type=large“

linkedin:

picture\u url=用户数据['picture-url']['picture-url']

推特:

picture\u url=picture\u url.rsplit(“,”,1)[0]+“+”+picture\u url.rsplit(“,”,1)[1]
,对于
rsplit()
请查看


希望有帮助。:

有一种更简单的方法

只需将以下内容添加到settings.py。例如,链接在

SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
    'SCOPE': [
        'r_basicprofile',
        'r_emailaddress'
    ],
    'PROFILE_FIELDS': [
        'id',
        'first-name',
        'last-name',
        'email-address',
        'picture-url',
        'public-profile-url',
    ]
}

字段被自动拉过。

我不得不这样使用:kwargs.get('user').socialaccount\u set.filter(provider='facebook').extra\u data。但是当我这样做时,我得到了这个错误:AttributeError at/accounts/facebook/login/callback/'QuerySet'对象没有属性'extra\u data',谢谢你的回答!!你的应用程序太棒了,我的例子错了(我刚刚纠正了它)。我忘了从查询集([0])中选择一项,如:“.filter(…)[0]”可以访问SocialIn参数中的商品,例如SocialIn.account.get_provider_display()、SocialIn.account.get_avatar_url()、SocialIn.account.get_profile_url()、SocialIn.account.provider、SocialIn.account.extra_数据['screen_name']…您如何知道哪些
范围
PROFILE_字段
键值可用?该选项取决于提供商。目前仅适用于LinkedIn
SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
    'SCOPE': [
        'r_basicprofile',
        'r_emailaddress'
    ],
    'PROFILE_FIELDS': [
        'id',
        'first-name',
        'last-name',
        'email-address',
        'picture-url',
        'public-profile-url',
    ]
}