Filtering Django Admin by Null/Is Not Null

后端 未结 7 1430
太阳男子
太阳男子 2020-12-16 15:03

I have a simple Django model like:

class Person(models.Model):
    referrer = models.ForeignKey(\'self\', null=True)
    ...

In this model\

7条回答
  •  感动是毒
    2020-12-16 16:07

    I have a simpler version of frnhr's answer, which actually filters on __isnull condition. (Django 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
    

    Then also:

    class StartNullListFilter(NullListFilter):
        title = u'Started'
        parameter_name = u'started'
    

    and finally:

    class SomeModelAdmin(admin.ModelAdmin):
        list_filter =  (StartNullListFilter, )
    

    I personally don't like to trash my admin.py with dozens of classes, so I came up with such a helper function:

    def null_filter(field, title_=None):
        class NullListFieldFilter(NullListFilter):
            parameter_name = field
            title = title_ or parameter_name
        return NullListFieldFilter
    

    Which I can later apply as in:

    class OtherModelAdmin(admin.ModelAdmin):
        list_filter =  (null_filter('somefield'), null_filter('ugly_field', _('Beautiful Name')), )
    

提交回复
热议问题