在Django管理控制台中为属性显示勾和叉图标

13 投票
2 回答
6788 浏览
提问于 2025-04-17 02:37

在Django的管理后台,如果某个字段是布尔类型(BooleanField)或者可空布尔类型(NullBooleanField),Django会用好看的“开”和“关”图标来代替简单的真(True)或假(False)。

现在,我的模型里其实没有布尔类型的字段,但我有一个属性(property),我想用这些图标来显示。不过,当我尝试这样做时,Django却报错说:'SomeAdmin.list_filter[0]' 指向 'is_activated',但它并不是一个字段。

请问有没有办法在不对Django进行太多修改的情况下,给这个字段显示这些漂亮的小图标呢?

谢谢!

2 个回答

7

在Django 3.0及以上版本中,正确的做法是使用 @admin.display

    @admin.display(
      boolean=True,
      ordering='-publish_date',
      description='Is Published?', 
    ) 
    def is_published(self, obj):
        return obj.publish_date is not None
35

你不需要使用 list_filter。你要找的属性是 list_display。文档里有个例子,教你怎么创建一个看起来像布尔值的列。简单来说,你可以这样做:

  1. 在类里创建一个方法:

    def is_activated(self)
        if self.bar == 'something':
            return True
        return False
    
  2. is_activated 方法下面直接添加 .boolean 方法属性:

    is_activated.boolean = True
    
  3. 把这个方法添加到 list_display 里:

    class MyAdmin(ModelAdmin):
    list_display = ['name', 'is_activated']

  4. 你会发现列名现在可能是 "Is Activated" 或类似的东西。如果你想改变列的标题,可以使用 short_description 方法属性:

    is_activated.short_description = "Activated"
    

撰写回答