Django меняет пароль без повторной регистрации

В моей системе пользователи сначала входят в систему и должны изменить свой пароль. У меня есть представление, которое меняет пароль. Проблема в том, что при перезагрузке страницы сеанс пользователя теряется и заставляет пользователя снова войти в систему. Я не знаю, как изменить это поведение. Обзор моего кода

просмотры.py

def change_password(request):
    if request.method == 'POST':
        data = request.body
        change = json.loads(data)
        id = change["id"]
        password = change["password"]
        user = get_object_or_404(CustomUser, pk=id)
        user.set_password(password)
        user.save()
        return HttpResponse('success')

 def login_success(request):
    if request.user.groups.filter(name="group1").exists():
        return redirect(group1)
    elif request.user.groups.filter(name="group2").exists():
        return redirect(group2)
    elif request.user.groups.filter(name="group3").exists():
        return redirect(group3)
    else:
        return redirect(group4)

Я использую модель CustomUser

модели.py

class CustomUser(AbstractBaseUser, PermissionsMixin):

    ...
    login = models.BooleanField(_('login'), default=False, blank=True)    
    ...

В моих шаблонах.

{% if user.login %}
    <h1>Hi User</h1>

{% else %}

    <form name="changePass" method="post">

    </form> 
{% endif %}

Мне нужно, чтобы пользователь оставался в системе даже после смены пароля, я делаю в шаблонах, чтобы изменить статус переменной входа в моем customuser.

Я ценю любые ответы или помощь, спасибо и извините за мой английский.


person Daniel Mendoza    schedule 17.03.2016    source источник


Ответы (1)


Начиная с версии 1.7, Django представила новую функцию, которая аннулирует текущий сеанс при обновлении пароля от пользователя. Подробнее об этом можно узнать здесь: https://docs.djangoproject.com/en/dev/topics/auth/default/#session-invalidation-on-password-change

Все, что вам нужно сделать, чтобы избежать выхода из системы, это вызвать метод update_session_auth_hash из django.contrib.auth как пример из документации:

from django.contrib.auth import update_session_auth_hash


def password_change(request):
    if request.method == 'POST':
        form = PasswordChangeForm(user=request.user, data=request.POST)
        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
    else:
        ...
person Gustavo Carvalho    schedule 17.03.2016