2010-07-11 14 views
57

Dies ist, was ich zur Zeit für die Registrierung bin mit:Wie automatisch einen Benutzer nach der Anmeldung in django anmelden

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      messages.info(request, "Thanks for registering. Please login to continue.") 
      return HttpResponseRedirect("/dashboard/") 
    else: 
     form = UserCreationForm() 
    return render_to_response("accounts/register.html", { 
     'form': form, 
    }, context_instance=RequestContext(request)) 

Ist es möglich, den Benutzer nicht erforderlich ist manuell nach dem Erstellen eines Kontos, sondern einfach anmelden, um zu sie automatisch anmelden? Vielen Dank.

edit: Ich hatte die login() Funktion ohne Erfolg versucht. Ich glaube das Problem ist, dass AUTHENTICATION_BACKENDS nicht gesetzt wurde.

+0

Ich glaube, Sie diese verwenden können: http://docs.djangoproject.com/de/dev/topics/auth/#django.contrib.auth.login –

Antwort

87

Mit den authenticate() und login() Funktionen:

from django.contrib.auth import authenticate, login 

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      messages.info(request, "Thanks for registering. You are now logged in.") 
      new_user = authenticate(username=form.cleaned_data['username'], 
            password=form.cleaned_data['password1'], 
            ) 
      login(request, new_user) 
      return HttpResponseRedirect("/dashboard/") 
+1

Vielen Dank. Ich hatte dies ohne Erfolg versucht, aber jetzt merkte ich, das Problem war, dass ich das Backend nicht spezifiziert hatte. Die Zeilen: new_user.backend = 'django.contrib.auth.backends.ModelBackend' Anmeldung (Anfrage, neuer_Benutzer) tun den Trick. (Oder sollte das Backend an anderer Stelle als bei jeder Registrierung angegeben werden?) – Chris

+2

Setzen Sie 'AUTHENTICATION_BACKENDS' auf' django.contrib.auth.backends.ModelBackend' in 'settings.py'. Weitere Informationen finden Sie unter http://docs.djangoproject.com/en/1.2/topics/auth/#specifying-authentication-backends. –

+0

Auch mit dieser Menge, bekomme ich den Fehler "'User' Objekt hat kein Attribut 'Backend'" – Chris

5

für Klasse basierte Ansichten hier war der Code, der für mich gearbeitet (django 1,7)

from django.contrib.auth import authenticate, login 
from django.contrib.auth.forms import UserCreationForm 
from django.views.generic import FormView 

class SignUp(FormView): 
    template_name = 'signup.html' 
    form_class = UserCreateForm 
    success_url='/account' 

    def form_valid(self, form): 
     #save the new user first 
     form.save() 
     #get the username and password 
     username = self.request.POST['username'] 
     password = self.request.POST['password1'] 
     #authenticate user then login 
     user = authenticate(username=username, password=password) 
     login(self.request, user) 
     return super(SignUp, self).form_valid(form) 
+0

Warum 'authenticate (username = username, password = password)' benötigt? Warum nicht einfach das Benutzerobjekt übergeben? – avi

+1

@avi Wenn Sie einen Benutzer manuell anmelden, müssen Sie den Benutzer mit authenticate() authentifizieren, bevor Sie login() aufrufen. authenticate() setzt ein Attribut für den Benutzer, der feststellt, welches Authentifizierungs-Backend diesen Benutzer erfolgreich authentifiziert hat (Details finden Sie in der Backend-Dokumentation). Diese Informationen werden später während des Anmeldevorgangs benötigt. Wenn Sie versuchen, ein direkt von der Datenbank abgerufenes Benutzerobjekt anzumelden, wird ein Fehler ausgegeben. Quelle: https://docs.djangoproject.com/de/1.9/topics/auth/default/#django.contrib.auth.login – f1nn

Verwandte Themen