如何使用django-allauth访问用户名称和个人资料

12
我正在使用Django和django-allauth进行社交认证。
我已经完成了身份验证,但是有没有人可以简单地举例说明如何:
- 显示已登录用户的名称和头像 - 向用户帐户添加一些信息?
例如,在主页上,我有:
{% if user.is_authenticated %}
<li><a href="{% url account_logout %}?next=/">Logout</a></li>
{% endif %}

那样可以正确显示注销链接,但是我该如何添加用户的姓名和头像呢?

类似以下伪代码:

<p>You're logged in with {{ user.account_provider? }} as {{ user }}.</p>
<img src="{{ user.avatar_url }}" />

那么,如果我想向用户个人资料中添加额外的属性,应该怎么做?我应该使用其他与Django用户相关的应用程序吗?

感谢您的帮助。


提供的答案有帮助吗?我和你一样有同样的问题,想知道答案,请告诉我好吗? - Samudra
2
请看一下我在这里的答案:https://dev59.com/L2ct5IYBdhLWcg3wQ7Uy#12226639 它展示了获取用户头像URL等信息的正确方法。 - pennersr
4个回答

13

对于使用社交账户注册的用户,可使用SocialAccount模型实例。

在您的模板中,您可以简单地写成:

头像 URL:{{ user.socialaccount_set.all.0.get_avatar_url }}
UID:{{ user.socialaccount_set.all.0.uid }}
加入日期:{{ user.socialaccount_set.all.0.date_joined}}
最近登录:{{ user.socialaccount_set.all.0.last_login}}

而对于全名:{{ user.socialaccount_set.all.0.extra_data.name }}

更多信息请参见:Django allauth源代码


这是适用于现代Django (1.11.x)和allauth (0.32.x)的正确答案。 - illagrenan

5

1
这些get_provider()和get_avatar_url()方法在最近的django和django-allauth中似乎没有传播到用户对象上。看起来需要手动填充上下文。 - geewiz
SocialAccount类仍然具有这些方法。您确定在上下文中拥有SocialAccount实例吗? - lig
2
我已经启用了allauth.socialaccount.context_processors.socialaccount上下文处理器,它会在上下文中放置一个“socialaccount”字典;该字典中的条目是活动提供者。然而,我并不清楚这个(或SocialAccount模型)如何修改用户对象,从而允许像“{{user.get_provider}}”这样的访问。也许我完全没有理解你的意思?抱歉,我对allauth、django和python都比较新,所以可能会忽略一些显而易见的东西。 - geewiz

1

您可以在用户类(User class)的外键中创建socialaccount集合的for循环,模板中代码如下:

{% for account in user.socialaccount_set.all %}

 {% comment %} show avatar from url {% endcomment %}
 <h2 style="text-transform:capitalize;">{{ account.provider }} account data</h2>

 <p><img width="50" height="50" src="{{ account.get_avatar_url }}"/></p>

 <p>UID: <a href="{{ account.extra_data.link }}">{{ account.uid }}</a></p>

 <p>Username: {{ account.extra_data.username }}</p>

  <p>First Name: {{ account.extra_data.first_name }}</p>

  <p>Last Name: {{ account.extra_data.last_name }}</p>

  <p>Dashboard Link: 
  <a href="{{ account.extra_data.link }}">{{ account.extra_data.link }}</a></p>
  {% empty %}
  <p>you haven't any social account please</p>
{% endfor %}

0

所以昨天我也遇到了困境,我在互联网上寻找解决方案,但没有一个像我想出的那样易懂... 安装和配置allauth包后,我执行了以下操作:

  1. 在应用程序目录中创建一个signal.py文件

  2. 在您的虚拟环境中找到allauth包

  3. 然后导航到allauth/socialaccount/models.py

  4. 这样您就可以更好地了解如何从allauth包中获取模型或调用其他函数和类

  5. 在app/signal.py中执行以下操作:

     from django.db.models.signals import post_save;p0-
     from django.dispatch import receiver
     from .models import Profile
     from allauth.socialaccount.models import SocialAccount# 步骤3使此操作成为可能
     from django.contrib.auth.models import User
    
     @receiver(post_save, sender = SocialAccount)
     def create_profile(sender, instance, created, **kwargs):
        if created:
           # 从社交账户中获取数据以为该用户创建个人资料
           profile=Profile(
                  user=instance.user,
                  photo=instance.extra_data['picture']
                          )
           profile.save()
         else:
        # 做其他事情
    

你可以看到信号的发送者是模型“SocialAccount”,因为在身份验证期间始终会创建此模型,因此获取字段“extra_data”,该字段是一个字典,然后从字段“extra_data”中的JSON对象中获取键“['picture']”...希望这对你有用。谢谢

通过这种方式,您可以获取图片的值,并将用户分配给一个个人资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接