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

Django自定义User模型为何不在权限认证模块下?如何调整?

问题

在base app中创建了一个自定义User模型,但该模型在Django Admin后台中显示在base app目录下,而非「权限与认证(Authorization and Authentication)」模块中。请问出现这种情况的原因是什么?如何将其添加到权限与认证模块下?

模型代码(models.py)

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from .managers import CustomManager

class CustomUser(AbstractBaseUser):
    name = models.CharField(max_length=50,default='Yet to be updated...')
    email = models.EmailField('email_address', unique=True)
    USN = models.CharField(max_length=10, default='Yet to be updated...')
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomManager()

    def has_perm(self, perm, obj=None):
        return self.is_superuser
    
    def has_module_perms(self, app_label):
        return self.is_superuser

    def __str__(self):
        return self.email

管理器代码(managers.py)

from django.contrib.auth.base_user import BaseUserManager

class CustomManager(BaseUserManager):

    def create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError("Email is must")
        
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)

        user.set_password(password)

        user.save()

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

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

Admin注册代码(admin.py)

from django.contrib import admin
from .models import CustomUser

admin.site.register(CustomUser)
原因与解决方法

原因

Django Admin后台的模型分组完全依据模型所属的app_label划分。你的CustomUser模型属于base app,所以默认会被归类到base分组下;而「权限与认证」模块对应内置的django.contrib.auth app分组,只有归属该app的模型才会默认显示在这里。

解决方法

方法一:修改模型的归属app_label

在CustomUser模型中添加Meta类,指定app_label为auth,这样模型会直接归属到auth app的分组下:

class CustomUser(AbstractBaseUser):
    # 原有字段...

    class Meta:
        app_label = 'auth'

注意:如果采用这种方式,需要在settings.py中同步修改AUTH_USER_MODEL配置为auth.CustomUser,同时要确保迁移文件正确生成(若项目已存在迁移,可能需要清理旧迁移后重新生成)。

方法二:在Admin注册时指定分组

如果不想改动模型的归属app,可以通过自定义ModelAdmin类,设置app_label属性为auth,让Admin后台将模型归类到「权限与认证」分组:

from django.contrib import admin
from .models import CustomUser

class CustomUserAdmin(admin.ModelAdmin):
    # 可根据需求添加Admin配置,比如list_display = ['email', 'name']
    app_label = 'auth'

admin.site.register(CustomUser, CustomUserAdmin)

这种方式下,模型本身仍属于base app,但在Admin后台会显示在「权限与认证」模块中。

补充:如果是要替换Django默认的User模型,必须在项目初始化阶段就在settings.py中设置AUTH_USER_MODEL = 'base.CustomUser'(对应方法二的情况),避免后续出现迁移冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:42:38