1

我正在为我的登录和注册视图和模板使用 django all auth,但我也想实现更改密码功能,所以默认情况下它有一个password_change.html我们可以使用的模板,但我想要一个自定义设计,而不想要通过使用内置allauth密码更改视图刷新页面,因此决定ChangePasswordForm通过在我的视图中导入它来仅使用 allauth 的形式。

我正在使用 ajax 将请求发布到 aurl(view)并返回 a Json Response,以便我可以在自定义模板中使用 jquery/ajax 中的响应。

视图.py

from allauth.account.forms import ChangePasswordForm

@login_required
def change_password(request):
    form =  ChangePasswordForm(data=request.POST)
    if form.is_valid():
        form.save()
        result = {'status':'done'}
    else:
        result = {'status':'undone', 'form_errors':form.errors}
    json_data = json.dumps(result)
    return HttpResponse(json_data, 'application/json')

模板.html

$('.form').click(function(){
   $.ajax({
                      type: "POST",
                              url: '/change_password/',
                              data: form_data,
                              success: function(response)
                                {
                                    if(response.status === 'done')
                                        console.log('great====>');
                                    ......
                                    .....   
                        }
                   });   
 });    

我正在单独渲染模板中的字段,就像form.oldpassword, form.newpassword, ....错误一样。

因此,当我在没有任何数据的情况下提交表单时,我会收到正确的错误消息this fields are required,但是当我只输入一个字段oldpassword并提交表单时,我会收到以下错误

  File "/home/user/Envs/proj/local/lib/python2.7/site-packages/django/forms/forms.py", line 290, in _clean_fields
    value = getattr(self, 'clean_%s' % name)()
  File "/home/user/Envs/proj/local/lib/python2.7/site-packages/allauth/account/forms.py", line 334, in clean_oldpassword
    if not self.user.check_password(self.cleaned_data.get("oldpassword")):
AttributeError: 'NoneType' object has no attribute 'check_password'

因此,在调试后,我检查了self.userallauth forms.py 中 ChangePasswordForm 类下 clean_oldpassword 验证方法中的值None,所以实际上我遇到了上述错误?

在使用 django allauth ChangePasswordForm 时,为什么实际上用户没有?

使用时我做错了什么ChangePasswordForm Form吗?

4

1 回答 1

2

您需要将用户对象传递给您的类:

form = ChangePasswordForm(data=request.POST, user=request.user)
于 2013-11-09T20:43:45.057 回答