首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-allauth检索头像头像

Django-allauth检索头像头像
EN

Stack Overflow用户
提问于 2015-03-17 00:32:02
回答 3查看 5K关注 0票数 12

我使用django-rest-authdjango-allauth进行用户注册/登录,使用用户的Facebook profile。

现在,我可以从Facebook获取一些标准信息(所有身份验证都是默认的)。

还有可能检索化身图片列表吗?如何在allAuth中做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2015-04-11 09:39:17

如果你想获取django模板中的头像图片:

代码语言:javascript
复制
<img src="{{ user.socialaccount_set.all.0.get_avatar_url }}" />

这就是你想要做的吗?

票数 23
EN

Stack Overflow用户

发布于 2016-11-09 09:10:00

让我快速描述一下我是如何做到这一点的(使用all_auth和rest_auth)。

基本上,'allauth => ‘提供了user_signed_up和user_logged_in信号。因此,您需要捕获它们并获取sociallogin对象的额外数据并填充您的avatar_url。

第1步:创建一个UserProfile模型:(存储avatar_url)

代码语言:javascript
复制
#models.py
try:
    from django.utils.encoding import force_text
except ImportError:
    from django.utils.encoding import force_unicode as force_text

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, verbose_name='user', related_name='profile')
    avatar_url = models.CharField(max_length=256, blank=True, null=True)

    def __str__(self):
        return force_text(self.user.email)

    class Meta():
        db_table = 'user_profile'

步骤2:捕获“user_signed_up”信号并填充“`avatar_url”

代码语言:javascript
复制
# signals.py

from allauth.account.signals import user_signed_up, user_logged_in

@receiver(user_signed_up)
def social_login_fname_lname_profilepic(sociallogin, user):
    preferred_avatar_size_pixels=256

    picture_url = "http://www.gravatar.com/avatar/{0}?s={1}".format(
        hashlib.md5(user.email.encode('UTF-8')).hexdigest(),
        preferred_avatar_size_pixels
    )

    if sociallogin:
        # Extract first / last names from social nets and store on User record
        if sociallogin.account.provider == 'twitter':
            name = sociallogin.account.extra_data['name']
            user.first_name = name.split()[0]
            user.last_name = name.split()[1]

        if sociallogin.account.provider == 'facebook':
            f_name = sociallogin.account.extra_data['first_name']
            l_name = sociallogin.account.extra_data['last_name']
            if f_name:
                user.first_name = f_name
            if l_name:
                user.last_name = l_name

            #verified = sociallogin.account.extra_data['verified']
            picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
                sociallogin.account.uid, preferred_avatar_size_pixels)

        if sociallogin.account.provider == 'google':
            f_name = sociallogin.account.extra_data['given_name']
            l_name = sociallogin.account.extra_data['family_name']
            if f_name:
                user.first_name = f_name
            if l_name:
                user.last_name = l_name
            #verified = sociallogin.account.extra_data['verified_email']
            picture_url = sociallogin.account.extra_data['picture']

    user.save()
    profile = UserProfile(user=user, avatar_url=picture_url)
    profile.save()        

希望这能对你有所帮助。

票数 11
EN

Stack Overflow用户

发布于 2021-02-10 08:05:47

如果您不想使用Django信号,您可以从allauth.socialaccount.adapter扩展DefaultSocialAccountAdapter并覆盖populate_user

代码语言:javascript
复制
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.account.utils import user_field


class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    def populate_user(self, request, sociallogin, data):
        user = super().populate_user(request, sociallogin, data)
        try:
            picture = sociallogin.account.extra_data['picture']
            user_field(user, "profile_photo", picture)
        except (KeyError, AttributeError):
            pass
        return user

注意:您还应该在settings.py中更改DefaultSocialAccountAdapter

代码语言:javascript
复制
SOCIALACCOUNT_ADAPTER = 'some_app.path.to.CustomSocialAccountAdapter'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29082098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档