Как автоматически войти в систему после регистрации в 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))

Можно ли не требовать от пользователя входа в систему вручную после создания учетной записи, а просто для автоматического входа в систему? Спасибо.

edit: Я пробовал функцию login() без успеха. Я считаю, что проблема заключается в том, что AUTHENTICATION_BACKENDS не был установлен.

Ответ 1

Использование функций authenticate() и login():

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

Ответ 2

для представлений на основе классов здесь был код, который работал для меня (первоначально Django 1.7, обновленный для 2.1)

from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
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 HttpResponseRedirect(self.get_success_url)

Ответ 3

Вы можете создать подкласс Django UserCreationForm и переопределить его методом save, чтобы войти в него, когда commit = True.

forms.py

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login

class CustomUserCreationForm(UserCreationForm):
    """
    A ModelForm for creating a User and logging 
    them in after commiting a save of the form.
    """

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    class Meta(UserCreationForm.Meta):
        pass

    def save(self, commit=True):
        user = super().save(commit=commit)
        if commit:
            auth_user = authenticate(
                username=self.cleaned_data['username'], 
                password=self.cleaned_data['password1']
            )
            login(self.request, auth_user)

        return user

Вам просто нужно убедиться, что вы передаете объект запроса при создании экземпляра формы. Вы можете сделать это, переопределив метод view get_form_kwargs.

views.py

def get_form_kwargs(self):
    # doesn't need self here
    form_kwargs = super().get_form_kwargs()
    form_kwargs['request'] = self.request
    return form_kwargs

Или убедитесь, что при создании экземпляра form_class вы делаете CustomUserCreationForm(data=request.POST, request=self.request).