Filtering Django Admin by Null/Is Not Null

后端 未结 7 1423
太阳男子
太阳男子 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 15:40

    Since Django 1.4 brings some changes to filters, I thought I save someone the time I just spent modifying the code from Cerin's accepted answer to work with Django 1.4 rc1.

    I have a model that has TimeField(null=True) named "started" and I wanted to filter for null and non-null values, so it's prety much the same problem as OP.
    So, here is what worked for me...

    Defined (actually included) these in admin.py:

    from django.contrib.admin.filters import SimpleListFilter
    
    class NullFilterSpec(SimpleListFilter):
        title = u''
    
        parameter_name = u''
    
        def lookups(self, request, model_admin):
            return (
                ('1', _('Has value'), ),
                ('0', _('None'), ),
            )
    
        def queryset(self, request, queryset):
            kwargs = {
            '%s'%self.parameter_name : None,
            }
            if self.value() == '0':
                return queryset.filter(**kwargs)
            if self.value() == '1':
                return queryset.exclude(**kwargs)
            return queryset
    
    
    
    class StartNullFilterSpec(NullFilterSpec):
        title = u'Started'
        parameter_name = u'started'
    

    Than just used them in ModelAdmin:

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

提交回复
热议问题