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

Django自定义用户模型执行makemigrations遇Unknown field错误求助

解决Django自定义用户模型的FieldError: Unknown field(s) (username) specified for CustomUser问题

嘿,这个错误其实很好定位——你的CustomUser模型里完全没有定义username字段,但你在UserCreateForm的配置里却把username列进了表单要显示的字段里,Django找不到这个字段,自然就报错了。

问题根源拆解

  • 你的CustomUser继承自AbstractBaseUser,只设置了email作为用户的唯一标识(USERNAME_FIELD = 'email'),模型里根本没有username这个字段。
  • 但你在forms.py的UserCreateForm的Meta类中,写了fields = ('username', 'email', 'password1', 'password2'),强制要求表单包含username,这就和模型结构完全不匹配了。

修复步骤

直接修改forms.py里的表单配置,把username从字段列表中移除,因为你的自定义用户模型不需要它:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserCreateForm(UserCreationForm):
    class Meta:
        # 移除username,因为CustomUser没有这个字段
        fields = ('email', 'password1', 'password2')
        model = get_user_model()

    def __init__(self,*args,**kwargs):
        super().__init__(*args, **kwargs)
        # 调整标签文本,适配当前表单字段
        self.fields['email'].label = "Email Address"

额外说明

如果你之后想给用户添加类似“显示名称”的字段(比如display_name),需要先在CustomUser模型里添加对应的字段:

class CustomUser(AbstractBaseUser):
    # 新增显示名字段
    display_name = models.CharField(max_length=255, unique=True)
    email = models.EmailField(max_length=255, unique=True)
    # ... 其他原有字段

然后再把display_name加入表单的fields列表中,同时按需更新模型的REQUIRED_FIELDS配置。

现在重新运行makemigrations和migrate命令,应该就能正常执行了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:27:43