2012-04-03 60 views
1

我正在开发一个网站,并且我已经集成了的功能,让用户更改他/她的密码。我正在使用django.contrib.auth中的内置视图。使用AJAX在Django中更改密码

现在,我们需要使用AJAX来做到这一点。我的意思是,这个想法是将请求发送到服务器,而不用重新加载整个页面。如果密码正确更改,那么我只需要显示一条消息,如果没有,则显示每个字段有错误的表单。

我能做到这一点创建用于此用途的单独视图,但我想知道如果有替代?我的意思是,视图应该很容易,但已经在django.contrib.auth中完成了......

回答

1

绝对可以继承现有的django.contrib.auth视图,但我认为编写自己的ajax特定视图是一种更好的方法无论如何它只需要几行代码。

下面是它可能看起来是这样的:

@login_required 
def change_password(request): 

    if request.is_ajax(): 
     try: 
      # extract new_password value from POST/JSON here, then 

      user = User.objects.get(username=request.user.username) 
     except User.DoesNotExist: 
      return HttpResponse("USER_NOT_FOUND") 
     else 
      user.set_password(new_password) 
      user.save() 

     return HttpResponse("OK") 
    else: 
     return HttpResponse(status = 400) 
+0

OP意味着用户只能更改他/她的密码。 GET方法在这里看起来也很糟糕。 – okm 2012-04-03 06:25:24

+0

@okm好的。我还提到'change_password',而不是'reset_password'。 @BluesRockAddict谢谢。实际上,我可以很容易地从'password_change'视图中复制和粘贴代码,并修改响应,但我想知道是否有一种方法不涉及复制和粘贴代码。更好的思考,我真的不认为有:'(' – 2012-04-03 06:31:31

+0

我的意思是为什么你需要在这里的id,不是request.user足够吗?你的代码允许登录用户修改其他密码,这听起来很糟糕。另外, HTTP方法有它自己的含义,GET不适用于这样的任务 – okm 2012-04-03 07:16:38

1

如果我选择,我会还与落实供您使用单独的视图去。

理想情况下,如果django.contrib.auth在基于类的视图中重新实现,那么您将能够重新使用更改密码的逻辑并仅为返回更适合AJAX的响应的部分编写代码。但太糟糕了,我们并没有那么奢侈,至少不是因为django 1.3或之前的版本。

但是要回答你的问题,是的,有一个替代方案(或者我称之为黑客),使您可以重用django.contrib.auth中的视图。假设您使用的是jQuery,则在提交更改密码表单时,您将向服务器发出AJAX POST请求,并期望返回(如下所示)html。返回的html与使用非AJAX POST时获得的html相同。

var post_url = $form.attr("action"); 
    $.ajax({ 
    type: "POST", 
    url: post_url, 
    data: $form.serialize() 
    }).done(function(html) { 
    // check the html and use that to determine what message to prompt back to your user 
    });