Как автоматически войти в систему после регистрации в django - PullRequest
61 голосов
/ 11 июля 2010

Это то, что я сейчас использую для регистрации:

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 не был установлен.

Ответы [ 3 ]

93 голосов
/ 11 июля 2010

Использование функций 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/")
7 голосов
/ 11 марта 2015

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

0 голосов
/ 01 июня 2019

Вы можете создать подкласс UserCreationForm в Django и переопределить его метод сохранения для входа в систему, когда 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

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

views.py

def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs(self)
    form_kwargs['request'] = self.request
    return form_kwargs

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...