我正在开发一个网站,我已经整合了让用户更改密码的功能。我正在使用django.contrib.auth
中的内置视图。
现在,我们需要使用AJAX 来实现。我的意思是,想法是将请求发送到服务器而不重新加载整个页面。如果密码更改正确,那么我只需要显示一条消息,如果没有,则需要显示每个字段错误的表单。
我可以为此目的创建一个单独的视图,但我想知道是否有替代?我的意思是,视图应该很简单,但已在django.contrib.auth
...
答案 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
});