django admin 只有两种状态非布尔类型的字段转成布尔类型,admin 后台显示 绿色勾 和 红色叉

2023-02-18 14:22:39 浏览数 (2)

正常情况下 models.BooleanField 类型字段在 django admin 后台 列表页面会自动显示 绿色勾 和 红色叉,如图:

有时候我们写模型的的时候写成了其他显示文案,如果只有两种状态时,又想显示成  绿色勾 和 红色叉,可以采用如下图所示代码快速实现:

代码语言:javascript复制
class Resume(models.Model):
    phone_status_choice = (
        ("1", "ON"),
        ('0', 'OFF'),
    )

    name = models.CharField(unique=True, max_length=48, verbose_name="用户名称")
    phone = models.CharField(max_length=32, verbose_name="手机号码")
    email = models.EmailField(max_length=128, null=True, blank=True, verbose_name="邮箱")
    ip = models.GenericIPAddressField(null=True, blank=True, verbose_name="IP")
    phone_order = models.IntegerField(default=0, verbose_name="序号", help_text="值越小,同分类中越靠前显示")
    phone_status = models.CharField(max_length=32, choices=phone_status_choice, default="0FF", verbose_name="必定使用",
                                    help_text="一定使用该号码")
    phone_status_select = models.CharField(max_length=32, choices=phone_status_choice, default="ON",
                                           verbose_name="上传使用",
                                           help_text="上传文件时,IP 在范围之内才使用")
    note = models.CharField(max_length=256, blank=True, null=True, verbose_name="备注")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    alter_time = models.DateTimeField(auto_now=True, verbose_name='最近修改时间')

    class Meta:
        # meta 是否固定?
        # 设置的是后台显示表名  默认是类名
        verbose_name = "手机号码"

        # 是设置复数形式时显示的名称
        verbose_name_plural = "手机号码列表"

    def __str__(self):
        return "%s" % self.name

    def colored_phone_status(self):
        return self.phone_status == "ON" or self.phone_status == "1"
    colored_phone_status.boolean = True
    colored_phone_status.short_description = "必定使用"

    def colored_phone_status_select(self):
        return self.phone_status_select == "ON" or self.phone_status_select == "1"

    colored_phone_status_select.boolean = True
    colored_phone_status_select.short_description = "上传使用"

但是,如果超过两种状态,其他状态就要自己使用  format_html 单独返回 icon,具体请看:https://xieboke.net/article/98/

0 人点赞