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

已解决:Django Admin列表页如何展示当前登录用户ID

Django Admin列表页展示当前登录用户ID实现方案

问题场景

开发Django项目时,已经通过重写save_model方法拿到了当前登录的用户对象,但不知道怎么把对应用户ID展示在Admin模型列表页,和Patient ID、Unit、Create Time等字段并列显示。

初始代码

admin.py初始代码

class GeneralAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super(GeneralAdmin, self).save_model(request, form, obj, change)
    list_display = ('id_patient', 'unit', 'create_time')
    search_fields = ('id_patient', 'unit', 'create_time')
    readonly_fields = ('unit', 'Birth_date','create_time',)

models.py初始代码

from django.db import models
from datetime import date, datetime
from django.contrib.auth.models import User

class Unit(models.Model):
    id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=300)

class Patient(models.Model):
    id = models.AutoField(primary_key=True, verbose_name='Patient ID')
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE)
    Birth_date = models.DateField()
    introducer = models.ForeignKey(User, 
        help_text = "该字段自动填充", 
        blank=True, null=True, on_delete=models.CASCADE) 
        # 尝试存储当前登录用户ID

    def save(self, *args, **kwargs):
        self.introducer = User.username # 此处运行报错
        super().save(*args, **kwargs)


class General(models.Model):
    id = models.AutoField(primary_key=True)
    id_patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
    unit = models.ForeignKey(Unit, help_text = "该字段自动填充", blank=True, null=True, on_delete=models.CASCADE)
    Birth_date = models.DateField(blank=True, null=True, help_text = "该字段自动填充")
    create_time = models.DateTimeField(blank=True, null = True, default = datetime.now())
    
    def save(self, *args, **kwargs):
        self.Birth_date = self.id_patient.Birth_date
        self.unit = self.id_patient.unit
        super().save(*args, **kwargs)


class Primary_Treatment_EBRT(models.Model):
    
    id = models.AutoField(primary_key=True)
    unit = models.ForeignKey(Unit, help_text = "该字段自动填充", blank=True, null=True, on_delete=models.CASCADE)
    Birth_date = models.DateField(blank=True, null=True, help_text = "该字段自动填充")
    create_time = models.DateTimeField(blank=True, null = True, default = datetime.now())
    id_patient = models.ForeignKey('Patient', on_delete=models.CASCADE)

    def save(self,*args, **kwargs):
        self.Birth_date = self.id_patient.Birth_date
        self.unit = self.id_patient.unit
        super().save(*args, **kwargs)

核心诉求:将obj.user对应的用户ID加入list_display配置,在Admin列表页正常展示。


解决步骤

只需要修改两处代码即可实现:

  • 第一步:修改models.py,在需要关联创建用户的模型下新增用户外键字段,同时调整create_time字段配置,去掉固定默认值,改为保存时动态赋值:
# 头部导入配置模块
from django.conf import settings

# 对应模型内修改字段
create_time = models.DateTimeField(blank=True, null = True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, 
    null=True, on_delete=models.CASCADE)

这里用settings.AUTH_USER_MODEL关联用户是Django官方推荐写法,后续如果替换自定义用户模型不需要修改外键配置。

  • 第二步:修改admin.py,修正原有save_model的参数传参顺序问题,在保存实例时给user、create_time字段赋值,同时把user字段加入list_display元组,就能在列表页看到对应用户信息:
from datetime import datetime

class PatientAdmin(admin.ModelAdmin):
    # 列表展示字段新增user
    list_display = ('id_patient', 'unit', 'create_time', 'user')
    search_fields = ('id_patient', 'unit', 'create_time', 'user')
    readonly_fields = ('unit', 'Birth_date','create_time', 'user')
    
    def save_model(self, request, obj, form, change, *args, **kwargs):
        obj.user = request.user
        obj.create_time = datetime.now()
        super(PatientAdmin, self).save_model(request, obj, form, change, *args, **kwargs)

注意:初始代码里调用父类save_model时把form和obj参数顺序写反了,会导致保存逻辑异常,修改时要注意参数顺序和方法定义保持一致。

修改完成后执行python manage.py makemigrations、python manage.py migrate同步数据库字段,重启服务后就能在Admin列表页看到每条记录对应的创建用户ID了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:15:55