Django Admin中的默认布尔过滤器

时间:2016-06-27 22:23:07

标签: django filter admin default

我已经看到了默认选择字段的解决方案。 Default filter in Django admin

如何将其扩展到布尔字段并不明显。我有一个存档字段,可以防止显示。我希望默认过滤器为“否”而不是“全部”。

2 个答案:

答案 0 :(得分:1)

class BooleanDefaultNoFilter(SimpleListFilter):
    def lookups(self, request, model_admin):
        return (
            ('all', 'All'),
            (1, 'Yes'),
            (None, 'No')
        )

    def choices(self, changelist):
        for lookup, title in self.lookup_choices:
            yield {
                'selected': self.value() == (str(lookup) if lookup else lookup),
                'query_string': changelist.get_query_string({self.parameter_name: lookup}, []),
                'display': title,
            }

    def queryset(self, request, queryset):
        if self.value():
            if self.value() == 'all':
                return queryset
            else:
                return queryset.filter(**{self.parameter_name: self.value()})

        elif self.value() == None:
            return queryset.filter(**{self.parameter_name: False})

class NamedFilter(BooleanDefaultNoFilter):
    title = _('InsertName')
    parameter_name = 'insertname'

class InsertNameAdmin(admin.ModelAdmin):
      list_filters = (NamedFilter)

答案 1 :(得分:0)

django.contrib.admin.ModelAdmin覆盖get_queryset方法是解决此问题的一种方法。

此方法允许您指定从管理站点请求该资源时要返回的对象。

class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(MyModelAdmin, self).get_queryset(request)
        # Here's where we specify what to filter our queryset by.
        return qs.filter(archived=False)