如何在基于SimpleListFilter的Django过滤器中覆盖Empty_label?

时间:2019-10-30 19:18:05

标签: django django-admin django-admin-filters

我正在基于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)

这样在我的显示列表中:全部,是和否, 我想将所有内容都更改为“否”,这样默认过滤器将为“否”,并且我的显示内容仅为“是”和“否”。

1 个答案:

答案 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

我希望它能起作用。