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
相关产品推荐
相关产品推荐

