2012-04-04 1 views
2

Nach der Installation und Einrichtung von social-auth spiele ich ein bisschen herum und versuche, den Dreh raus zu bekommen. Ich habe die Dokumentation gelesen und das Beispielprojekt verwendet, um es zu starten.Wie kann ich einen bestimmten Anbieter von Django Social-Auth in einer Vorlage erhalten?

Aber bis jetzt habe ich keine Ahnung, wie man Informationen über einen bestimmten Anbieter bekommt. Im Beispielprojekt werden die templatetags immer auf diese Weise benutzt:

{% for type, accounts in social_auth.associated.items %} 
    {% for account in accounts %} 
     {{account.provider}} is connected. 
    {% endfor %} 
{% endfor %} 

Was ich jetzt tun möchte, ist alle Anbieter nicht auflisten, aber überprüfen, ob jemand sein Konto (dh.) Facebook verbunden ist. So kann ich etwas tun könnte:

if user==connected_to_facebook 
    provide some functionality 
endif 

Aus dem obigen Beispiel weiß ich, dass social_auth.associated.items Tupel von (type,account) enthält, wobei „facebook“ würde dann mit allen Werten für account.provider in einer Liste sein.

Was mir in den Sinn kommt, ist dies:

{% if "facebook" in social_auth.associated.items.accounts.provider %} 

, die, offensichtlich wird nicht funktionieren. Ich denke, das wird funktionieren, aber nicht wieder das Ergebnis i bin nach:

{% if "facebook" in social_auth.associated.items[1].provider %} 

Gibt es bestimmte Funktionen in Django, dass ich dies tun kann? Vielleicht fehlt mir ein spezielles TemplateTag? Oder ist diese Funktionalität bereits in social_auth integriert und ich vermisste irgendwie die Dokumentation? Oder, mein schlimmster Verdacht, ist es wirklich sehr offensichtlich, und ich bin nur ...

Jede Hilfe sehr willkommen.

Antwort

3

„social_auth“ ist nicht einige Tupel innerhalb von Tupeln ist es ein dictionairy:

{'not_associated': {}, 'backends': {'oauth2': ['facebook']}, 
'associated': {'oauth2': [<UserSocialAuth:testuser>]}} 

, die sicherlich viel mehr Sinn macht, aber immer noch nicht überall führen. Also nahm ich einen Blick auf einen Benutzer, der sein Konto noch nicht zugeordnet ist, und dass Wörterbuch sieht wie folgt aus:

{'not_associated': {'oauth2': ['facebook']}, 'backends': {'oauth2': ['facebook']}, 
'associated': {}} 

Jetzt fand ich etwas sehr nützlich:

{% if "facebook" in social_auth.not_associated.oauth2 %} 
{% else %} 
    provide facebook functionality 
{% endif %} 

, das funktioniert. Alles, was Sie wissen müssen, ist, welche Art der Authentifizierung das Backend, das Sie suchen, verwendet, dann stellen Sie sicher, dass es nicht im nicht zugeordneten Feld von social_auth ist.

0

Im Fall muss jemand eine disconnect-URL erstellen, hier ist der Hack-y Code kam ich mit, wo providers ist eine Liste, die ich vorbei bin in wie ["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 %} 

Es scheint, wie sollte es sein ein Wörterbuch der zugehörigen Konten, anstatt dies zu tun, aber ich konnte es nicht herausfinden. Nicht sicher, was passiert, wenn ein Benutzer sein Konto zweimal autorisieren konnte.