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

如何在Django Admin中为用户模块添加自定义字段及Objectives、Tests分区?

嘿,这个需求在Django里实现起来很清晰,分两大步骤就能搞定:先给User模型加上你需要的自定义字段,再在Admin后台重新布局界面,添上你要的「Objectives」和「Tests」分区。我给你一步步拆解细节:

第一步:扩展User模型添加自定义字段

Django提供了两种主流方式扩展User模型,我更推荐用继承AbstractUser的方式,因为它能直接把自定义字段整合到User模型里,操作更直观:

  1. 在你的app的models.py里定义自定义用户模型:
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    # 基础自定义字段示例
    department = models.CharField(max_length=100, blank=True, verbose_name="所属部门")
    employee_id = models.CharField(max_length=20, unique=True, blank=True, verbose_name="员工编号")
    
    # 「Objectives」分区对应的字段
    objective_title = models.CharField(max_length=200, blank=True, verbose_name="目标标题")
    objective_description = models.TextField(blank=True, verbose_name="目标描述")
    
    # 「Tests」分区对应的字段
    test_score = models.IntegerField(null=True, blank=True, verbose_name="测试分数")
    test_date = models.DateField(null=True, blank=True, verbose_name="测试日期")
  1. 在项目的settings.py里指定使用这个自定义用户模型(这一步必须设置!):
AUTH_USER_MODEL = '你的app名称.CustomUser'
  1. 执行数据库迁移命令,让字段生效:
python manage.py makemigrations
python manage.py migrate

注意:如果是已有数据的老项目,修改AUTH_USER_MODEL要谨慎,建议先备份数据再操作;新项目直接这么做完全没问题。

第二步:自定义Admin界面,新增分区

接下来重写UserAdmin的布局,把字段分到指定的分区里:

在你的app的admin.py里编写如下代码:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    # 重写fieldsets,按需求组织字段分区
    fieldsets = (
        # 保留系统默认分区,也可根据需求调整
        (None, {'fields': ('username', 'password')}),
        ('个人信息', {'fields': ('first_name', 'last_name', 'email', 'department', 'employee_id')}),
        ('权限设置', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('重要日期', {'fields': ('last_login', 'date_joined')}),
        # 新增你要的「Objectives」分区
        ('Objectives', {'fields': ('objective_title', 'objective_description')}),
        # 新增你要的「Tests」分区
        ('Tests', {'fields': ('test_score', 'test_date')}),
    )

    # 可选:设置列表页显示的字段,方便快速查看
    list_display = ('username', 'email', 'department', 'employee_id', 'is_staff')

# 注册自定义用户模型和对应的Admin类
admin.site.register(CustomUser, CustomUserAdmin)

备选方案:用OneToOne关联Profile模型

如果你的自定义字段和User模型是松散关联(比如后续可能单独拆分),也可以用OneToOne字段关联一个Profile模型,然后在Admin里用Inline嵌入:

  1. models.py里定义Profile模型:
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # Objectives相关字段
    objective_title = models.CharField(max_length=200, blank=True)
    objective_description = models.TextField(blank=True)
    # Tests相关字段
    test_score = models.IntegerField(null=True, blank=True)
    test_date = models.DateField(null=True, blank=True)
  1. admin.py里添加Inline并整合到UserAdmin:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import UserProfile

class ObjectivesInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'Objectives'
    fields = ('objective_title', 'objective_description')

class TestsInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'Tests'
    fields = ('test_score', 'test_date')

class CustomUserAdmin(UserAdmin):
    inlines = (ObjectivesInline, TestsInline)

# 重新注册User模型和自定义Admin类
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

这种方式会在Admin用户编辑页里分别显示「Objectives」和「Tests」两个内嵌分区,适合字段较多或需要独立管理的场景。

内容的提问来源于stack exchange,提问作者Enrique Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:23