我已经看到了默认选择字段的解决方案。 Default filter in Django admin
如何将其扩展到布尔字段并不明显。我有一个存档字段,可以防止显示。我希望默认过滤器为“否”而不是“全部”。
答案 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)