Próbuję, aby użytkownicy automatycznie logowali się po rejestracji. Jednak wydaje się, że użytkownik jest zalogowany tylko na czas renderowania następnej strony html (user.is_authenticated zwraca True w moich szablonach) i zostaje wylogowany natychmiast po (request.user zwraca AnonymousUser w metodzie, którą wywołuję przez AJAX na następnej stronie - przejście na inną stronę również pokazuje, że nie jesteś już zalogowany, ponieważ moje szablony ponownie wyświetlają login zamiast linków wylogowania). Jeśli zamiast tego spróbuję skomentowanego kodu, authenticate() zawsze zwraca NONE.

Co ja robię źle?

def signup_view(request):
    if request.method == 'POST':
        form = UserSignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            send_confirmation_email(user, current_site.domain)
            # user_login = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
            # login(request, user_login)
            login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            args = {'user': user}
            return render(request, 'accounts/signup_success.html', args)
    else:
        form = UserSignUpForm()
    args = {'form': form, 'project_name': settings.PROJECT_NAME}
    return render(request, 'accounts/signup.html', args)
0
Elias Suess 19 listopad 2019, 16:38
Jeśli ustawiasz user.is_active = False to użytkownik nie będzie mógł się zalogować.
 – 
Nalin Dobhal
19 listopad 2019, 16:41
Nie wierzę w to. działa dla nieaktywnych użytkowników, jeśli używam mojej strony logowania, która zasadniczo robi to samo, co komentowany kod. Ale spróbuję.
 – 
Elias Suess
19 listopad 2019, 16:52
user.is_active = False jest ustawiony. Dlaczego jest ustawiony na False, gdy oczekujesz, że użytkownik będzie zalogowany?. Spróbuj zmienić na True i odkomentuj funkcję authenticate().
 – 
Durai
19 listopad 2019, 16:52
Cholera, to działa i rzeczywiście ma sens. Ale jak mogę automatycznie zalogować użytkownika, a także zmusić go do potwierdzenia jego adresu e-mail
 – 
Elias Suess
19 listopad 2019, 17:01
Nie próbowałem tej sugestii. Ale możesz spróbować tego samego lub podobnego podejścia. Możesz wysłać wiadomość e-mail, aby potwierdzić i ustawić wygaśnięcie sesji na wylogowanie. Gdy użytkownik kliknął potwierdzenie, zaktualizuj niektóre błędy jako is_confirmed, podobne do is_active, i wygaś sesję do wylogowania (również logika po stronie klienta i po stronie serwera). Mam nadzieję że to pomoże.
 – 
Durai
19 listopad 2019, 17:11

1 odpowiedź

Proszę użyć następujących linii kodu. Może w pełni spełnić Twoje wymagania.

def signup(request):
if request.method == 'POST':
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        username = form.cleaned_data.get('username')
        raw_password = form.cleaned_data.get('password')
        user = authenticate(username=username, password=raw_password)
        login(request, user)
        return redirect('records:dashboard')
else:
    form = UserCreationForm()
return render(request, 'registration/signup.html', {'form': form})
0
Vaibhav Mishra 20 listopad 2019, 08:32