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

重写Django密码重置:AbstractUser自定义用户缺失字段报错求助

解决Django自定义AbstractUser后密码重置出现ProgrammingError的问题

我之前也碰到过一模一样的问题,别担心,这通常是几个常见的配置或模型定义疏漏导致的,下面是一步步的排查和解决方法:

1. 确认AUTH_USER_MODEL配置正确且生效

这是最容易踩坑的点——如果你的settings.py里没有正确指定自定义用户模型,Django的认证模块(包括密码重置视图)会默认尝试使用原生的User模型字段,而你的自定义表没有这些字段就会报错。

打开settings.py,确保有这一行(替换成你的应用名和模型名):

AUTH_USER_MODEL = "your_app.CustomUser"

注意:这个配置必须在第一次执行数据库迁移前就设置好。如果之前没设置就迁移了,可能需要清理旧的迁移文件并重新生成(开发环境可以这么做,生产环境要先备份数据)。

2. 检查自定义User模型的继承和字段定义

确保你的模型是正确继承AbstractUser,并且没有意外覆盖或删除了自带的date_joined和is_active字段:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    # 这里只添加你的自定义字段,不要修改或删除AbstractUser自带的字段
    # 示例:
    phone_number = models.CharField(max_length=11, unique=True, null=True)
    
    # 不要写类似下面的代码,这会覆盖AbstractUser的默认字段:
    # is_active = models.BooleanField()  # 没有默认值会导致问题
    # date_joined = models.DateTimeField()  # 缺少默认值或auto_now_add

AbstractUser已经内置了is_active(默认True)和date_joined(默认当前时间)字段,不需要你手动添加,除非你有特殊需求并正确处理默认值。

3. 确保密码重置相关代码使用get_user_model()

如果你自己重写了密码重置的视图、表单或信号,不要直接导入原生的User模型,而是使用Django提供的get_user_model()来获取当前配置的自定义用户模型:

from django.contrib.auth import get_user_model

User = get_user_model()

# 比如在表单或视图中查询用户时:
user = User.objects.get(email=request.POST.get('email'))

硬编码导入django.contrib.auth.models.User会导致代码忽略你的自定义模型配置,从而找不到对应的字段。

4. 验证数据库迁移和表结构

如果上面的配置都没问题,那可能是迁移没有正确执行到数据库:

  • 先运行python manage.py showmigrations,检查你的用户应用的迁移是否都已应用(前面有[X]标记)。
  • 直接查看数据库中的用户表(比如your_app_customuser),确认是否存在date_joined和is_active字段。如果没有,说明迁移文件生成有问题:
    1. 备份数据库(重要!)
    2. 删除用户应用migrations目录下除了__init__.py的所有文件
    3. 重新生成迁移:python manage.py makemigrations
    4. 执行迁移:python manage.py migrate

5. 检查是否自定义了认证后端

如果你自定义了认证后端,确保它没有在查询用户时引用不存在的字段。比如在authenticate方法中,不要写类似User.objects.get(is_active=True, ...)的代码,除非你的模型确实有这个字段(当然继承AbstractUser的话是有的,但如果之前的迁移有问题可能会缺失)。

按照上面的步骤排查,应该就能解决这个错误了。

内容的提问来源于stack exchange,提问作者tommyshere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:27