已解决: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
相关产品推荐
相关产品推荐

