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

如何为Django自定义用户模型新增字段并解决报错问题

Django自定义用户模型新增字段报错/不生效修复方案

核心问题原因

新增字段失效、报错基本由以下问题导致:

  • 模型类未正确定义新增字段,且原有代码存在REQUIRES_FIELDS拼写错误(Django识别的正确参数名是REQUIRED_FIELDS)
  • 未正确执行数据库迁移,或前期未配置AUTH_USER_MODEL导致表结构冲突
  • 表单层未同步添加新字段,导致前端传值无法被表单接收、存入数据库
  • (可选)admin后台未注册新字段,导致后台看不到新增字段误以为功能未生效

分步修复操作

1. 修正models.py,添加目标字段

首先在User模型中显式定义你需要的first_name、last_name、phone_number字段,修正原有拼写错误:

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

class User(AbstractUser):
    # 新增字段定义,可根据需求调整字段长度、是否允许为空等参数
    first_name = models.CharField(max_length=150, blank=True, verbose_name="名")
    last_name = models.CharField(max_length=150, blank=True, verbose_name="姓")
    phone_number = models.CharField(max_length=11, unique=True, blank=True, null=True, verbose_name="手机号", error_messages={"unique":"该手机号已被注册"})
    
    email = models.EmailField( max_length=150,unique=True,error_messages={"unique":"The email must be unique."})

    # 修正拼写错误:原代码写的REQUIRES_FIELDS无法被Django识别
    REQUIRED_FIELDS = ["email"]
    objects = CustomeUserManager()

    def __str__(self):
        return str(self.pk) + "." + self.username

注意:如果你的项目还没执行过第一次migrate,请先在settings.py中添加配置AUTH_USER_MODEL = "你的app名称.User",否则会出现用户表结构冲突,后续修改成本极高。

2. 处理数据库迁移

根据你当前项目的阶段选择迁移方案:

  • 项目处于开发初期、无重要存量数据:删除对应app下migrations文件夹内除__init__.py外的所有文件,删除本地数据库文件(如默认的db.sqlite3),依次执行以下命令重新生成表结构:
python manage.py makemigrations
python manage.py migrate
  • 项目已有存量数据、不能删库:给新增字段设置blank=True, null=True或默认值(比如phone_number字段加default=""),再执行上述两条迁移命令,避免存量数据字段为空触发约束报错。

3. 修正表单form.py,同步新增字段

原有表单的fields列表未包含新增字段,会导致表单直接忽略对应传值,自然无法存入数据库,同时补全原来缺失的confirm_password字段定义:

from django import forms
from .models import User

class UserRegistrations(forms.ModelForm):
    # 显式定义不在模型中的确认密码字段
    confirm_password = forms.CharField(widget=forms.PasswordInput(), label="确认密码")
    class Meta:
        model = User
        # 将新增的三个字段加入表单字段列表
        fields = ("username", "email", "first_name", "last_name", "phone_number", "password",)
        widgets = {
            "password": forms.PasswordInput(),
        }

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(username__iexact=username).exists():
            raise forms.ValidationError("该用户名已存在")
        return username

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError("该邮箱已被注册")
        return email

    def clean_password(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password != confirm_password:
            raise forms.ValidationError("两次输入密码不一致")
        return password

4. (可选)适配admin后台

如果你需要在Django默认admin后台编辑新字段,修改对应app的admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

class CustomUserAdmin(UserAdmin):
    fieldsets = UserAdmin.fieldsets + (
        ("额外信息", {"fields": ("phone_number",)}),
    )
    add_fieldsets = UserAdmin.add_fieldsets + (
        ("额外信息", {"fields": ("first_name", "last_name", "phone_number",)}),
    )

admin.site.register(User, CustomUserAdmin)

补充说明

你现有的manager.py已经通过**extra_fields支持接收任意新增模型字段,创建用户时只要把first_name、last_name、phone_number作为参数传入create_user或create_superuser方法即可正常存储,不需要额外修改管理器代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:42:58