You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义User模型登录报错及超级用户创建异常求助

问题解决指南

问题1:登录时出现 ValueError: Cannot query "johndoe": Must be "User" instance

原因分析

这个错误由两个核心问题导致:

  1. User模型导入错误:LoginView中导入的User大概率是Django默认的django.contrib.auth.models.User,而非你在Account应用中自定义的User模型。
  2. 未配置默认用户模型:未在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:53:10