Frage

Ich versuche eine Website zu erstellen, auf der Leute nur ihre E -Mail -Adressen angeben und sie mit Cookies und allem angemeldet sind. Zu einem späteren Zeitpunkt werde ich fragen, wie sie Passwort und Namen geben, aber kein Benutzername wird verwendet. Ich versuche dies mit Django-Registrierung zu tun, aber ich bekomme Fehler und habe ein paar Probleme.

Um Benutzernamen als Anmeldefunktion zu deaktivieren, habe ich Str (time ()) anstelle von Benutzername gesetzt - ich habe nach etwas gesucht, das sich jedes Mal ändert.

Wenn ich jedoch die Authentifizierung überspringe (was ich derzeit nicht brauche), erhalte ich Fehler:

'RegistrationProfile' object has no attribute 'backend'

Alternativ kann ich die Authentifizierung verlassen, aber dann weiß ich nicht, wie ich sie nur mit E -Mail und kein Passwort authentifiziert. Außerdem weiß ich nicht, wie ich die nächste Zeile zum Laufen bringen kann:

auth.login(request, ProfileUser)

Wenn mich jemand hier rausholen kann, wäre es großartig. Hier ist ein Code:

meine Formklasse:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p

meine Sicht:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )

und ich werde jeden anderen benötigten benötigt posten

War es hilfreich?

Lösung

Du bekommst das 'RegistrationProfile' object has no attribute 'backend' Fehler, weil der Benutzer noch nicht authentifiziert ist. Um jemanden anzumelden, müssen Sie das anrufen authenticate Methode zuerst, für die ein Passwort erforderlich ist. Was Sie stattdessen tun können, ist Folgendes:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)

Rufen Sie dann einfach die an, um jemanden anzumelden, einfach die _login_user Funktion mit der Anfrage und User Modell. (Das wird sein profile.user in Ihrem Fall wahrscheinlich) tun, anstatt anzurufen auth.login. Ich bin mir nicht sicher, wie Sie feststellen, ob dies ein gültiger Benutzer ist oder nicht, ohne Passwort oder Benutzername, aber ich überlasse Ihnen das. Wenn Sie immer noch Probleme haben, lassen Sie es mich wissen.

Kurze Erklärung:

Was hier im Grunde genommen passiert, ist, dass Django verlangt, dass ein Benutzer authentifiziert wird, um über die angemeldet zu werden login Funktion. Diese Authentifizierung wird normalerweise von der durchgeführt authenticate Funktion, die einen Benutzernamen und ein Kennwort erfordert, und prüft, ob das angegebene Passwort mit der Hashed -Version in der Datenbank übereinstimmt. Wenn dies der Fall ist, fügt es dem ein Authentifizierungs -Backend hinzu User Modell.

Da Sie also kein Passwort und einen Benutzernamen haben, müssen Sie nur Ihre eigene Methode zum Hinzufügen des Authentifizierungs -Backends zum Hinzufügen zu der User Modell. Und das ist was mein _login_user) Funktion erledigt - Wenn der Benutzer bereits authentifiziert ist, ruft er nur auf login, Andernfalls fügt es zuerst das Standard -Backend zum Fühe hinzu User Modell, ohne nach einem korrekten Benutzernamen und einem korrekten Passwort zu überprüfen (wie authenticate tut).

Andere Tipps

Für andere, die diesen Thread lesen, habe ich eine ähnliche Fehlermeldung erhalten, als ich user.objects.create () anstelle von user.objects.create_user () verwendet habe. Grundsätzlich bestand die erste Methode darin, ein klares Kennwort festzulegen, während create_user das Passwort verschlüsselt. Löschen Passwörter werden nicht authentifiziert. Überprüfen Sie Ihre Datenbank. Wenn Sie Passwörter im Löschen festlegen, müssen Sie stattdessen wahrscheinlich create_user () verwenden.

Die Anforderung des Autors könnte behoben werden, indem einfach ein Standardbenutzer und ein Standardkennwort über create_user () anstelle von user.save () festgelegt werden.

Sie können ein bekanntes Kennwort erstellen (in die Einstellungen einstellen.py) und dies verwenden, als ob der Benutzer es eingegeben hätte. Erstellen Sie den Benutzer damit und authentifizieren den Benutzer damit.

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