Django自定义User模型登录报错及超级用户创建异常求助
问题解决指南
问题1:登录时出现 ValueError: Cannot query "johndoe": Must be "User" instance
原因分析
这个错误由两个核心问题导致:
- User模型导入错误:
LoginView中导入的User大概率是Django默认的django.contrib.auth.models.User,而非你在Account应用中自定义的User模型。 - 未配置默认用户模型:未在
settings.py中指定自定义User模型为系统默认用户模型,导致Token模块仍关联原生User模型,和你的自定义模型不兼容。
解决步骤
步骤1:配置默认用户模型
在项目settings.py中添加以下配置:AUTH_USER_MODEL = 'Account.User'注意:该配置必须在首次执行数据库迁移前设置;若已执行过迁移,需清空数据库和迁移文件后重新初始化。
步骤2:修正LoginView的User导入
确保LoginView导入的是自定义User模型:from .models import User # 从当前Account应用的models中导入 # 禁止使用 from django.contrib.auth.models import User
问题2:创建超级用户时生成密文密码而非输入内容
这是Django的正常安全机制,系统不会明文存储用户密码,会自动对输入的密码进行哈希处理后存入数据库。你输入的密码仅用于生成哈希值,数据库中不会保留明文,属于符合安全规范的设计,无需调整。
登录逻辑的其他错误修正
你的LoginView中直接对比user.password != password是错误的——数据库存储的是哈希后的密码,无法与明文直接匹配。需改用Django提供的check_password方法验证:
修正后的post方法代码:
def post(self, request): """ Getting the required information for login. """ try: email = request.data["email"] password = request.data["password"] if not (email and password): return Response(data={"error": "Some fields are required."}, status=status.HTTP_400_BAD_REQUEST) user = User.objects.get(email=email) # 改用check_password验证密码有效性 if not user.check_password(password): return Response(data={'error': "Password is invalid."}, status=status.HTTP_400_BAD_REQUEST) token, created = Token.objects.get_or_create(user=user) return Response(data={'token': token.key}, status=status.HTTP_200_OK) except User.DoesNotExist: return Response(data={'error': "User not found."}, status=status.HTTP_404_NOT_FOUND) except RequestException: return Response(data={"error": "An error occurred. Please check your internet connection."}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
额外优化:自定义User模型中无需手动定义id = models.AutoField(primary_key=True),AbstractUser已包含主键字段,手动定义会造成冗余,建议删除该行。
内容的提问来源于stack exchange,提问作者nima_ shadloo
相关产品推荐
相关产品推荐

