简介
项目开发时遇到的一个需求,有一个SysUser表和一个Company表,字段如下所示,我们需要在django admin中在SysUser基本信息的时候一起渲染出Company_name而不是Company_id。
class Company(models.Model):
class Meta:
verbose_name = "公司管理" # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
company_id = models.AutoField(primary_key=True, verbose_name='公司ID')
company_name = models.CharField(max_length=255, verbose_name='公司名称', unique=True)
company_descrption = models.CharField("公司描述", null=True, max_length=255)
creator_id = models.IntegerField(null=True, blank=True, verbose_name='创建者ID')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_id = models.IntegerField(null=True, blank=True, verbose_name='更新者ID')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
deleted_choice = (
(True, "是"),
(False, "否")
)
is_deleted = models.BooleanField("逻辑删除", default=False, choices=deleted_choice)
def __str__(self):
return self.company_name
class SysUser(models.Model):
class Meta:
verbose_name = '用户管理' # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
user_id = models.AutoField(primary_key=True, verbose_name='用户ID')
company_id = models.ForeignKey(Company, on_delete=models.DO_NOTHING, null=True, blank=True,
verbose_name='公司ID')
user_account = models.CharField(max_length=50, unique=True, verbose_name='用户账号')
user_password = models.CharField(max_length=128, verbose_name='用户密码')
user_name = models.CharField(max_length=50, verbose_name='用户名')
user_avatar = models.CharField(max_length=255, null=True, blank=True, verbose_name='用户头像地址')
user_email = models.EmailField(max_length=254, null=True, blank=True, verbose_name='用户邮箱')
user_phone = models.CharField(max_length=20, null=True, blank=True, verbose_name='用户电话')
user_create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
models.DateTimeField()
user_update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
status_choices = (
(1, "正常"),
(0, "停用")
)
user_status = models.SmallIntegerField(default=1, null=True, blank=True, choices=status_choices,
verbose_name='用户状态', help_text="默认1为正常,0表示停用")
解决方案
- 在django 3.2之后,支持使用
@admin.display()
装饰器来定制化一些需要显示字段。在本示例中,我需要查询company_id对应的company_name再显示出来,因此对应代码解决方案如下所示:
# admin.py
@admin.register(models.SysUser)
class SysUserAdmin(admin.ModelAdmin):
list_display = (
"user_id", "user_account", "user_name", "company_name", "user_phone", "user_email", "user_create_time",
'user_status')
@admin.display(description="公司名称")
def company_name(self, obj):
return obj.company_id.company_name if obj.company_id else ''
![在这里插入图片描述](https://img-blog.csdnimg.cn/26be8d3abeb44978baa08657add43921.png)
- 最后运行结果如下所示:
- 如果不用装饰器的话,代码如下所示:(还是觉得用装饰器会方便一些)
# admin.py
from django.contrib import admin
from .models import SysUser
@admin.register(SysUser)
class SysUserAdmin(admin.ModelAdmin):
list_display = ('user_id', 'company', 'user_account', 'user_name', 'user_email', 'user_phone', 'user_status')
def company(self, obj):
return obj.company_id.company_name
company.short_description = '公司名称'