我正在使用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
并提交表单时,我收到以下错误< / p>
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
时我做错了什么?
答案 0 :(得分:2)
您需要将用户对象传递给您的类:
form = ChangePasswordForm(data=request.POST, user=request.user)