Django Admin列表过滤器自定义BooleanField显示名称的问题
Django Admin中BooleanField choices在列表过滤器不生效的原因及解决办法
原因
Django Admin的列表过滤器默认使用BooleanFieldListFilter,这个过滤器并没有读取模型字段设置的choices参数,它的选项文本是硬编码的“全部/是/否/未知”。而详情页和列表页显示字段值时,会调用字段自动生成的get_<field_name>_display()方法,这个方法会读取choices返回对应文本,所以这两个区域能正常显示自定义文本,过滤器却不行。
解决方法
自定义一个过滤器,继承默认的BooleanFieldListFilter,重写lookups方法来读取模型字段的choices生成选项:
步骤1:编写自定义过滤器
在app/admin.py中添加以下代码:
from django.contrib.admin.filters import BooleanFieldListFilter class BuildingConditionFilter(BooleanFieldListFilter): def lookups(self, request, model_admin): # 直接读取模型字段的choices配置 return model_admin.model._meta.get_field('is_new_building').choices
步骤2:在Admin类中使用自定义过滤器
修改FlatAdmin的list_filter配置,指定使用自定义过滤器:
class FlatAdmin(admin.ModelAdmin): list_filter = (('is_new_building', BuildingConditionFilter), )
这样列表过滤器的选项就会变成「全部/New/Old/Unknown」,和你在choices中定义的文本一致了。
内容的提问来源于stack exchange,提问作者Andrei Alekseev
相关产品推荐
相关产品推荐

