У меня есть более простая версия ответа frnhr, которая на самом деле фильтрует условие __isnull
.
(Джанго 1,4 +):
from django.contrib.admin import SimpleListFilter
class NullListFilter(SimpleListFilter):
def lookups(self, request, model_admin):
return (
('1', 'Null', ),
('0', '!= Null', ),
)
def queryset(self, request, queryset):
if self.value() in ('0', '1'):
kwargs = { '{0}__isnull'.format(self.parameter_name) : self.value() == '1' }
return queryset.filter(**kwargs)
return queryset
Тогда также:
class StartNullListFilter(NullListFilter):
title = u'Started'
parameter_name = u'started'
и наконец:
class SomeModelAdmin(admin.ModelAdmin):
list_filter = (StartNullListFilter, )
Лично я не люблю ломать мою admin.py
десятками классов, поэтому я придумал такую вспомогательную функцию:
def null_filter(field, title_=None):
class NullListFieldFilter(NullListFilter):
parameter_name = field
title = title_ or parameter_name
return NullListFieldFilter
К которому я могу позже применить, как в:
class OtherModelAdmin(admin.ModelAdmin):
list_filter = (null_filter('somefield'), null_filter('ugly_field', _('Beautiful Name')), )