2010-07-11 12 views
57

Questo è quello che sto attualmente in uso per la registrazione:Come effettuare il login automatico di un utente dopo la registrazione in Django

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)) 

Non è possibile richiedere all'utente di accedere manualmente dopo aver creato un account, ma semplicemente per registrarli automaticamente? Grazie.

modifica: Avevo provato la funzione login() senza successo. Credo che il problema è che AUTHENTICATION_BACKENDS non è stato impostato.

+0

Penso che si può usare questo: http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.login –

risposta

87

Utilizzando le authenticate() e login() funzioni:

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

Grazie. L'avevo provato senza successo, ma ora mi rendo conto che il problema era che non avevo specificato il back-end. Le linee: new_user.backend = 'django.contrib.auth.backends.ModelBackend' login (request, new_user) fare il trucco. (O il backend deve essere specificato altrove invece che ogni volta che c'è una registrazione?) – Chris

+2

Imposta 'AUTHENTICATION_BACKENDS' su' django.contrib.auth.backends.ModelBackend' in 'settings.py'. Per ulteriori informazioni, consultare http://docs.djangoproject.com/en/1.2/topics/auth/#specifying-authentication-backends. –

+0

Anche con quel set, viene visualizzato l'errore "L'oggetto 'Utente' non ha attributo 'backend'" – Chris

5

per le viste a base di classe qui è stato il codice che ha funzionato per me (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

Perché è necessario "autenticarsi (nome utente = nome utente, password = password)"? perché non passare semplicemente l'oggetto utente? – avi

+1

@avi Quando si registra manualmente un utente, è necessario autenticare l'utente con authenticate() prima di chiamare login(). authenticate() imposta un attributo sull'utente notando quale backend di autenticazione ha autenticato correttamente quell'utente (vedere la documentazione dei backend per i dettagli), e queste informazioni sono necessarie in seguito durante il processo di login. Verrà generato un errore se si tenta di accedere direttamente a un oggetto utente recuperato dal database. Fonte: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.login – f1nn

Problemi correlati