Search code examples
pythondjangofilterbooleandjango-admin

Custom BooleanField name in Django admin list filter


In Django admin I can change default True/False representation of BooleanField using choices argument. It appears in object page and list page. But it doesn't changes in admin list filter. Why? How can I change defaults 'All/Yes/No/Unknown' in list_filter?

app/models.py

CHOICES_BUILDING_CONDITION = (
    (True, 'New'),
    (False, 'Old'),
    (None, 'Unknown'),
)

class Flat(models.Model):
    is_new_building = models.BooleanField(
        'Building condition', null=True, blank=True, choices=CHOICES_BUILDING_CONDITION
)

app/admin.py

class FlatAdmin(admin.ModelAdmin):
    list_filter = ('is_new_building', )

Solution

  • You can replicate its behavior with:

    from django.contrib import admin
    from django.utils.translation import gettext_lazy as _
    
    NEW_BUILDING_MAPPING = {'true': True, 'false': False, 'none': None}
    
    
    class NewBuildingListFilter(admin.SimpleListFilter):
        title = _('New building')
        parameter_name = 'is_new_building'
    
        def lookups(self, request, model_admin):
            return (
                ('true', _('New')),
                ('false', _('Old')),
                ('none', _('Unknown')),
            )
    
        def queryset(self, request, queryset):
            val = self.value()
            if val is not None:
                return queryset.filter(is_new_building=NEW_BUILDING_MAPPING[val])
            return queryset

    and then plug in this filter with:

    class FlatAdmin(admin.ModelAdmin):
        list_filter = (NewBuildingListFilter,)