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

  • 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。
  • 📝 CSDN主页:Zeeland🔥
  • 📣 我的博客:Zeeland
  • 📚 Github主页: Undertone0809 (Zeeland) (github.com)
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:django开发手册🍁
  • 💬介绍:The mixture of software dev+Iot+ml+anything🔥

简介

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

扩展阅读

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Djangoadmin.py 中,如果要在 list_display 中显示一个外键的相关字段,可以使用双下划线语法。例如,如果有一个名为 Book 的模型,并且它有一个外键字段 author,你可以这样在 BookAdmin 中的 list_display 中显示作者的名字: ```python from django.contrib import admin from .models import Book class BookAdmin(admin.ModelAdmin): list_display = ('title', 'author__name') admin.site.register(Book, BookAdmin) ``` 其中,'author__name' 表示要显示作者的名字,其中的双下划线 '__' 表示要通过外键访问作者模型的 name 字段。需要注意的是,如果外键是多对多关系,则需要使用 'related_name' 来设置反向关联的名称,例如: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=50) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author, related_name='books') ``` 在 BookAdmin 中,可以这样显示作者们的名字: ```python class BookAdmin(admin.ModelAdmin): def authors_name(self, obj): return ', '.join([a.name for a in obj.authors.all()]) authors_name.short_description = 'Authors' list_display = ('title', 'authors_name') ``` 其中,'authors_name' 是一个自定义的方法,用来返回作者们的名字,然后在 list_display 中显示。需要注意的是,自定义的方法需要设置一个短描述 'short_description',用来在列表头部显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeeland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值