Django报错:'NoneType' object has no attribute 'save',无效登录需重定向
解决无效登录时出现的'NoneType' object has no attribute 'save'错误
错误原因
问题出在views.py的逻辑顺序和冗余代码上:
- 当使用无效账号登录时,
authenticate()会返回None,此时直接调用user.save()会触发属性错误,因为None没有save方法 - 代码在判断
user是否存在之前就执行了user.save(),逻辑顺序完全颠倒 - 登录流程中根本不需要调用
user.save(),用户对象是从数据库读取的,没有做任何修改操作,保存属于冗余步骤
修正后的代码
views.py
def user_login(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): user = authenticate(request, **form.cleaned_data) if user: login(request, user) return redirect('home') else: return redirect(reverse('login')) else: form = LoginForm() return render(request, 'accountApp/login.html', {'form': form})
关键改动说明
- 移除冗余的
user.save():登录操作不需要保存用户对象,Django的login()函数已经处理了会话相关的必要逻辑 - 调整判断顺序:先确认
user不为None,再执行后续操作,彻底避免None对象调用方法的错误 - 可选优化(提升用户体验):如果需要给用户显示登录失败提示,可以修改重定向逻辑,让用户停留在登录页并看到错误信息:
else: form.add_error(None, '用户名或密码错误') return render(request, 'accountApp/login.html', {'form': form})
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

