Как переопределить empty_label в фильтре django, основанном на SimpleListFilter? - PullRequest
0 голосов
/ 30 октября 2019

Я делаю фильтр на django на основе SimpleListFilter, я хотел бы знать, если есть способ заменить метку все в фильтре.

Я пытался 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 голосов
/ 03 ноября 2019

Попробуйте переопределить метод Варианты


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. Но в этом случае No не будет отмечен как выбранный. Если «Нет», выберите «Если фильтр не выбран», попробуйте использовать метод «Нет» вместо метода исправления пустого элемента в строке, удалив приведение к 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

Надеюсь, это сработает.

...