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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top