【问题标题】:AttributeError: 'NoneType' object has no attribute 'check_password' error in django allauthAttributeError: 'NoneType' 对象在 django allauth 中没有属性 'check_password' 错误
【发布时间】:2013-11-21 20:32:39
【问题描述】:

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

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

views.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')

templates.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'

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

当使用 django allauth ChangePasswordForm 时,为什么用户实际上是空的?

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

【问题讨论】:

    标签: python django forms passwords django-allauth


    【解决方案1】:

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

    form = ChangePasswordForm(data=request.POST, user=request.user)
    

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2018-02-11
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多