【django开发手册】django admin如何显示外键对应的字段

简介

项目开发时遇到的一个需求,有一个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 = '公司名称'

扩展阅读

猜你喜欢

转载自blog.csdn.net/linZinan_/article/details/129653296