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

Django连接MySQL创建超级用户时触发TypeError:缺少必填参数X

解决Django切换MySQL后创建超级用户报错问题

问题原因

自定义User模型并将USERNAME_FIELD设为email后,未重写适配的UserManager,导致默认的create_superuser方法参数不匹配,抛出缺失必填参数的错误。

解决方案

1. 重写UserManager适配自定义User模型

修改models.py,添加自定义的用户管理器并绑定到User模型:

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

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('用户必须提供邮箱')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('超级用户必须设置is_staff=True')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('超级用户必须设置is_superuser=True')

        return self.create_user(email, password, **extra_fields)

class User(AbstractUser):
    name = models.CharField(max_length=20, null=True)
    email = models.EmailField(unique=True, null=True)
    bio = models.TextField(max_length=200, null=True)
    avatar = models.ImageField(null=True, default="avatar.svg")
    
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    
    objects = UserManager()  # 绑定自定义管理器

2. 重新执行数据库迁移

确保MySQL中studymate数据库已创建,依次运行以下命令:

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

此时会提示输入邮箱和密码,即可正常创建超级用户。

额外优化(可选)

由于当前登录逻辑使用username查询,但用户标识已改为email,可修改views.py中的loginPage函数适配邮箱登录:

def loginPage(request):
    page = 'login'
    if request.user.is_authenticated:
        return redirect('home')
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')
        try:    
            user = User.objects.get(email=email)
        except:
            messages.error(request, '邮箱不存在')
        user = authenticate(request, username=email, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, '邮箱或密码错误')

    context={'page':page}
    return render(request, 'base/login_register.html', context)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:48:23