我正在基于SimpleListFilter在Django上创建一个过滤器,我想知道是否有一种方法可以替换过滤器中的所有标签。
我尝试了ovveride空字符串,但没有用
class IgnoreAttendanceReportFilter(admin.SimpleListFilter):
title = 'Aulas ignoradas pelo extrato de frequência'
parameter_name = 'aula__status__ignore_in_attendance_report'
def lookups(self, request, model_admin):
return (
('yes', 'Sim'),
('', 'No'),
)
def queryset(self, request, queryset):
if self.value() == 'yes':
return queryset.filter(aula__status__ignore_in_attendance_report=True)
# return queryset
return queryset.filter(aula__status__ignore_in_attendance_report=False)
这样在我的显示列表中:全部,是和否, 我想将所有内容都更改为“否”,这样默认过滤器将为“否”,并且我的显示内容仅为“是”和“否”。
答案 0 :(得分:0)
尝试覆盖方法选择
class IgnoreAttendanceReportFilter(admin.SimpleListFilter):
[ ... ]
def choices(self, changelist):
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == str(lookup),
'query_string': changelist.get_query_string({self.parameter_name: lookup}),
'display': title,
}
现在默认值为False。但是在这种情况下,不会将其标记为已选中。如果不必选择过滤器,请尝试使用None代替空字符串ale fix方法,方法是删除强制转换为str。固定方法如下。
class IgnoreAttendanceReportFilter(admin.SimpleListFilter):
[ ... ]
def choices(self, changelist):
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == lookup,
'query_string': changelist.get_query_string({self.parameter_name: lookup}),
'display': title,
}
如果字段的默认值为False,则无需对其进行过滤。
此外,如果您根据需要过滤其他模型中的字段,请使用select_related。否则,此过滤器将进行很多冗余的数据库查询。因此,如果 aula 和 status 是其他模型,请尝试使用类似的方法。
[....]
def queryset(self, request, queryset):
if self.value() == 'yes':
return queryset.select_related('aula__status').filter(aula__status__ignore_in_attendance_report=True)
return queryset
我希望它能起作用。