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

