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

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

验证修改效果

  1. 执行数据库迁移:运行python manage.py makemigrations和python manage.py migrate
  2. 创建超级用户:执行python manage.py createsuperuser,此时只会提示你输入first_name、last_name、email、avatar和password,无需输入ID,ID会自动生成
  3. 登录测试:用用户名和密码即可正常登录后台或自定义登录页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:25:42