2010-07-11 4 views
57

Esto es lo que estoy utilizando actualmente para la inscripción:Cómo conectarse automáticamente un usuario después de la inscripción en 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)) 

¿No es posible que requiere que el usuario iniciar sesión manualmente después de crear una cuenta, sino simplemente iniciar sesión automáticamente? Gracias.

editar: He intentado la función login() sin éxito. Creo que el problema es que AUTHENTICATION_BACKENDS no se configuró.

+0

Creo que se puede utilizar esto: http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.login –

Respuesta

87

Usando los authenticate() y login() funciones:

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

Gracias. Había intentado esto sin éxito, pero ahora me doy cuenta de que el problema era que no había especificado el back-end. Las líneas: new_user.backend = 'django.contrib.auth.backends.ModelBackend' login (request, new_user) hagan el truco. (¿O debería el backend especificarse en otro lugar en lugar de cada vez que hay un registro?) – Chris

+2

Establezca 'AUTHENTICATION_BACKENDS' en' django.contrib.auth.backends.ModelBackend' en 'settings.py'. Para obtener más información, consulte http://docs.djangoproject.com/en/1.2/topics/auth/#specifying-authentication-backends. –

+0

Incluso con ese conjunto, obtengo el error "El objeto 'Usuario' no tiene ningún atributo 'back-end'" – Chris

5

de puntos de vista basados ​​clase aquí era el código que trabajó para mí (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

¿Por qué 'authenticate (username = username, password = password)' es necesario? ¿por qué no simplemente pasar el objeto del usuario? – avi

+1

@avi Cuando inicia sesión manualmente en un usuario, debe autenticar correctamente al usuario con authenticate() antes de llamar a login(). authenticate() establece un atributo en el usuario que indica qué servidor de autenticación autenticó correctamente a ese usuario (consulte la documentación de los back-end para obtener más información), y esta información se necesita más adelante durante el proceso de inicio de sesión. Se generará un error si intenta iniciar sesión directamente en un objeto de usuario recuperado de la base de datos. Fuente: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.login – f1nn

Cuestiones relacionadas