Django自定义自增整数ID用户模型:登录与超级用户创建问题
Django自定义自增ID用户模型,实现username登录且创建超级用户无需输入ID
你的需求完全可行,问题出在当前代码里把USERNAME_FIELD设成了id,这就导致登录必须用ID,且创建超级用户时会要求输入ID。调整以下几点就能解决:
关键修改步骤
- 把登录字段改回username:将
USERNAME_FIELD的值从'id'改为'username',系统就会用username作为登录凭证。 - 调整必填字段列表:
REQUIRED_FIELDS不需要包含username(因为它已经是USERNAME_FIELD),只需要列出创建用户时必须填写的其他字段(password会被单独处理,无需加入)。 - 保留自增ID:Django默认会给模型添加自增的
id主键,你手动声明id = models.AutoField(primary_key=True)也没问题,保存用户时系统会自动生成ID,完全不需要手动输入。
修改后的完整代码
from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager class MyAccountManager(BaseUserManager): def create_user(self, first_name, last_name, email, username, avatar, password=None): if not username: raise ValueError('User must have an username') if not avatar: raise ValueError('User must have an avatar') user = self.model( email=self.normalize_email(email), username=username, avatar=avatar, first_name=first_name, last_name=last_name ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, first_name, last_name, email, username, avatar, password): user = self.create_user( email=self.normalize_email(email), username=username, avatar=avatar, password=password, first_name=first_name, last_name=last_name ) user.is_admin = True user.is_active = True user.is_staff = True user.is_superuser = True user.save(using=self._db) return user class Account(AbstractBaseUser): # 自增ID主键,手动声明或省略都可以,Django默认会生成该字段 id = models.AutoField(primary_key=True) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) username = models.CharField(max_length=50, unique=True) email = models.CharField(max_length=50, unique=True) avatar = models.CharField(max_length=200) # 权限相关字段 is_admin = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) is_superadmin = models.BooleanField(default=False) # 修改为username作为登录标识字段 USERNAME_FIELD = 'username' # 移除已作为登录字段的username,保留其他必填项 REQUIRED_FIELDS = ['first_name', 'last_name', 'email', 'avatar'] objects = MyAccountManager() def __str__(self): return self.username def has_perm(self, perm, obj=None): return self.is_admin def has_module_perms(self, app_label): # 修正原代码的参数拼写错误:add_label → app_label return True
验证修改效果
- 执行数据库迁移:运行
python manage.py makemigrations和python manage.py migrate - 创建超级用户:执行
python manage.py createsuperuser,此时只会提示你输入first_name、last_name、email、avatar和password,无需输入ID,ID会自动生成 - 登录测试:用用户名和密码即可正常登录后台或自定义登录页面
内容的提问来源于stack exchange,提问作者Vulsan Bianca
相关产品推荐
相关产品推荐

