使用AJAX在Django中更改密码

时间:2012-04-03 05:50:26

标签: python ajax django django-views django-authentication

我正在开发一个网站,我已经整合了让用户更改密码的功能。我正在使用django.contrib.auth中的内置视图。

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

我可以为此目的创建一个单独的视图,但我想知道是否有替代?我的意思是,视图应该很简单,但已在django.contrib.auth ...

中完成

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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
  });