Django更改密码而不再记录

时间:2016-03-17 03:47:38

标签: python django django-models django-views django-users

在我的系统中,用户首先进入系统并且必须更改其密码。 我有一个更改密码的视图,问题是当页面重新加载用户会话时丢失并强制用户再次登录。 我不知道如何改变这种行为。我的代码概述

views.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模型

models.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中登录变量的状态。

我感谢任何答案或帮助,谢谢,对不起我的英语。

1 个答案:

答案 0 :(得分:8)

从版本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:
        ...