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

