Django Userprofile ... ohne Passwort
-
05-07-2019 - |
Frage
Ich mag eine Teilmenge von Benutzern zu erstellen, ohne dass ein vollständiges geblasenes Konto mit dieser Person verbunden ist noch kein Login hat ... im Grunde als eine Möglichkeit, einen Fotografen Feld zu Fotos hinzuzufügen (da in vielen Fällen, sie werden nie auf die Site anmelden tatsächlich). Ein Nachteil ist, dass ich würde auch später für sie ein Konto zu ermöglichen, in der Lage sein mag.
Also, ich denke, die Frage ist, was der beste Weg ist eine „People“ Tabelle einrichten, die mit Userprofilen, ohne tatsächlich Erweiterung der Benutzertabelle auf die Benutzertabelle bindet.
Lösung
Benutzerprofil (wie durch django.contrib.auth.models.User.get_profile
zurück) verlängert nicht die Benutzertabelle - das Modell, das Sie als Profilmodell angeben mit der AUTH_PROFILE_MODULE
Einstellung ist nur ein Modell, das eine ForeignKey
muss User
. get_profile
und die Einstellung ist wirklich nur ein Komfort-API eine Instanz eines bestimmten Modells für den Zugriff auf die eine ForeignKey
zu einer bestimmten User
Instanz hat.
Als solche ist eine Option, ein Profilmodell zu erstellen, in dem die ForeignKey
zu User
null
werden können und ordnen Sie Ihre Photo
Modell mit diesem Profilmodell anstelle des User
Modell. Dies würde ermöglichen es Ihnen, ein Profil für einen nicht vorhandenen Benutzer zu erstellen und ein registrierter Benutzer auf das Profil zu einem späteren Zeitpunkt anschließen.
Andere Tipps
Benutzer, die sich nicht anmelden kann? Gerade ihnen ein völlig zufälliges Passwort gegeben.
import random
user.set_password( str(random.random()) )
Sie werden nie anmelden können.
Versorgen Sie Ihre eigene Authentifizierungsroutine, dann können Sie überprüfen (oder nicht überprüfen), was Sie wollen. Wir tun dies, so dass, wenn sie unter normalen Benutzername scheitern, können wir sie auch auf E-Mail / Passwort einlassen (obwohl das ist nicht das, was ich zeige unten).
in settings.py:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
)
in userprofile / my_authenticate.py:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class MyLoginBackend(ModelBackend):
"""Return User record if username + (some test) is valid.
Return None if no match.
"""
def authenticate(self, username=None, password=None, request=None):
try:
user = User.objects.get(username=username)
# plus any other test of User/UserProfile, etc.
return user # indicates success
except User.DoesNotExist:
return None
# authenticate
# class MyLoginBackend
Aus der Dokumentation auf django Auth , wenn Sie verwenden möchten, die User-Modell, ist es zwingend erforderlich, einen Benutzernamen und ein Passwort haben, gibt es keine „anonymen Konten“. Ich denke, Sie Konten mit einem Standard-Passwort erstellen können und geben Sie dann die Gelegenheit für die Menschen ein „echtes“ Konto zu aktivieren (mit einem Passwort selbst).
Um eine „People“ Tabelle einrichten, die auf die Benutzertabelle binden Sie nur ein ForeignKey Feld verwenden müssen (das ist eigentlich die empfohlene Weg Hinzufügen zusätzliche Informationen zu dem User-Modell, und nicht die Vererbung)
Modell mit einem ForeignKey rel="nofollow Feld auf Benutzer Verknüpfung möglicherweise nicht arbeiten, wie Sie wollen, weil Sie den anonymen Zugriff benötigen. Ich bin mir nicht sicher, ob das funktionieren wird, aber Sie könnten versuchen, was passiert, wenn Sie es ein ForeignKey lassen müssen: AnonymousUser (dessen id immer keine!) statt.
Wenn Sie es versuchen, posten Sie Ihre Ergebnisse hier, würde ich neugierig sein.
Die django.contrib.auth.models.User existiert nur für den Zweck Standard-Authentifizierungs-Backend verwenden (Datenbank-basiert). Wenn Sie Ihr eigenes Backend schreiben, können Sie einige Konten passwordless machen, unter Beibehaltung normale Konten mit Passwörtern. Django Dokumentation hat eine noreferrer"> Kapitel rel="nofollow.
Ein weiterer upvote für insin Antwort : handhaben dies durch eine UserProfile
. James Bennett ein große Artikel über django.contrib.auth.models.User
erstreckt. Er geht durch ein paar Methoden, erklärt ihre Vor / Nachteile und landet auf dem UserProfile
Weg als ideal.