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

使用自定义Django模型对接DRF TokenAuthentication报is_active属性错误求助

错误原因

DRF 自带的 IsAuthenticated 权限类、TokenAuthentication 认证逻辑默认都会校验用户对象的 is_active 属性,你当前完全自定义的 User 模型既没有继承 Django 内置的用户基类,也没有手动添加该属性,因此触发属性不存在的报错。

解决方案

推荐按优先级选择以下方案:

  • 方案一(最推荐):自定义用户模型继承 Django 内置 AbstractUser
    该方案可以直接复用 Django 封装好的 is_active、is_authenticated、密码加密、用户状态管理等成熟能力,无需自己重复实现基础逻辑。
    调整你的 models.py 中 User 类定义:

    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        # 保留你自定义的字段,AbstractUser自带的用户名、邮箱、密码等字段无需重复声明
        birth = models.DateField()
    

    同时需要在 settings.py 中声明自定义用户模型:

    AUTH_USER_MODEL = '你的应用名.User'
    

    调整完成后执行数据库迁移命令即可:

    python manage.py makemigrations
    python manage.py migrate
    
  • 方案二:纯自定义用户模型手动补充必要属性
    如果你确定不需要 Django 内置用户体系的其他能力,只想保留现有自定义结构,可以直接在 User 模型中添加 is_active 字段:

    class User(models.Model):
        name = models.CharField(max_length=100)
        email = models.EmailField()
        birth = models.DateField()
        # 新增激活状态字段,默认值设为True代表新用户默认激活
        is_active = models.BooleanField(default=True, verbose_name="是否激活")
    

    如果你不需要控制用户激活状态,也可以用属性装饰器直接返回固定值,无需新增数据库字段:

    class User(models.Model):
        name = models.CharField(max_length=100)
        email = models.EmailField()
        birth = models.DateField()
    
        @property
        def is_active(self):
            # 所有用户默认都是激活状态
            return True
    

注意:不建议通过重写 TokenAuthentication 的 authenticate_credentials 方法跳过 is_active 校验,该操作会绕过用户状态验证,存在安全风险。

内容的提问来源于stack exchange,提问作者Mohammad Imam Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 13:15:01