2016-03-17 40 views
1

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

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登录变量的状态记录下来。

我感谢任何答案或帮助,谢谢,并为我的英语感到抱歉。

回答

8

从版本1.7开始,Django引入了一项新功能,当您更新用户的密码时会使当前会话无效。 你可以看到更多关于它在这里:https://docs.djangoproject.com/en/dev/topics/auth/default/#session-invalidation-on-password-change

所有你需要做的,以避免注销是django.contrib.auth调用该方法update_session_auth_hash从文档的例子:

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: 
     ... 
相关问题