Django1.11登录页面报错:'NoneType'对象无'is_active'属性
错误原因拆解
你碰到的这个AttributeError其实是典型的逻辑失误——看你代码里的这行判断:
if user is None and user.is_active:
当auth.authenticate()验证失败(比如用户名密码不匹配)时,会返回None。这时候你还去访问user.is_active,None类型根本没有这个属性,直接就抛出错误了。而且这个判断逻辑完全搞反了:我们要的是用户验证成功(user不为空)且账号处于激活状态,才执行登录操作,而不是判断用户为空的时候去检查激活状态。
修复方案
把判断逻辑修正过来,同时补充验证失败的处理逻辑,让流程更完整。这里是修正后的代码:
from django.shortcuts import render, HttpResponseRedirect from django.contrib import auth def login(request): # 已登录用户直接跳转首页 if request.user.is_authenticated(): return HttpResponseRedirect('/index/') error_message = "" # 只在POST请求时处理登录逻辑 if request.method == "POST": username = request.POST.get('username', '') password = request.POST.get('password', '') user = auth.authenticate(username=username, password=password) # 正确的判断逻辑:用户存在 且 已激活 if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect('/index/') else: # 给用户反馈错误信息 error_message = "用户名/密码错误,或账号未激活" # GET请求或验证失败时返回登录页面,传递错误信息 return render(request, 'login.html', {'error_msg': error_message})
额外提示
- 记得在你的登录模板(比如
login.html)里添加对error_msg的渲染,这样用户能看到明确的错误提示,体验更好。 - 你用的是Django 1.11,
request.user.is_authenticated()是正确的方法调用;如果以后升级到Django 2.0+,这个会变成属性request.user.is_authenticated(不带括号),不过当前版本不用改。
内容的提问来源于stack exchange,提问作者naturlich
相关产品推荐
相关产品推荐

