在安装和设置社交认证后,我正在玩一下,试图掌握它。我已经阅读了文档,并使用了示例项目来运行它。
但直到现在我还不知道如何获取某个提供商的信息。在示例项目中,模板标记始终以这种方式使用:
{% for type, accounts in social_auth.associated.items %}
{% for account in accounts %}
{{account.provider}} is connected.
{% endfor %}
{% endfor %}
我现在要做的不是列出所有提供商,而是检查是否有人将他的帐户连接到(即。)facebook。这样我可以做这样的事情:
if user==connected_to_facebook
provide some functionality
endif
从上面的示例中我知道social_auth.associated.items包含(type,account)
元组,其中“facebook”将出现在包含account.provider
所有值的列表中。
我想到的是:
{% if "facebook" in social_auth.associated.items.accounts.provider %}
显然,它不会起作用。我认为这个会起作用,但不会返回我之后的结果:
{% if "facebook" in social_auth.associated.items[1].provider %}
Django中是否有一些我可以使用的功能?也许有些特殊的模板标签我不见了?或者这个功能已经内置到social_auth中,我不知何故错过了文档?或者,我最可疑的是,它真的很明显,我只是......
非常欢迎任何帮助。
答案 0 :(得分:3)
“social_auth”不是元组中的一些元组,它是一个字典:
{'not_associated': {}, 'backends': {'oauth2': ['facebook']},
'associated': {'oauth2': [<UserSocialAuth:testuser>]}}
这当然更有意义,但仍然没有领先。所以我看了一个尚未关联他的帐户的用户,那里的字典看起来像这样:
{'not_associated': {'oauth2': ['facebook']}, 'backends': {'oauth2': ['facebook']},
'associated': {}}
现在我发现了一些有用的东西:
{% if "facebook" in social_auth.not_associated.oauth2 %}
{% else %}
provide facebook functionality
{% endif %}
有效。您需要知道的是您要查找的后端使用哪种类型的身份验证,然后确保它不在social_auth的not_associated字段中。
答案 1 :(得分:0)
如果有人需要创建断开连接的网址,请参阅我提出的hack-y代码,其中providers
是我传递的列表["Facebook", "Twitter"]
{% for p in providers %}
<h2>Link {{ p }} Account</h2>
<p>Use your {{ p }} account to log in
{% if p|lower in social_auth.not_associated %}
<a href="{% url socialauth_associate_begin p|lower %}?next={{ request.path }}" class="off">No</a>
{% else %}
{% for item in social_auth.associated.all %}{% if item.provider == p|lower %}
<a href="{% url socialauth_disconnect_individual p|lower item.id %}" class="on">Yes</a>
{% endif %}{% endfor %}
{% endif %}
</p>
{% endfor %}
似乎应该有关联帐户的字典而不是这样做,但我无法弄明白。不确定如果用户设法两次授权他们的帐户会发生什么。