Использование django_property_filter, но фильтр свойств не совпадает при неактивном

#django #django-filter

Вопрос:

Я не могу понять, что я здесь делаю не так. Я использую django_property_filter, чтобы добавить фильтр в свой список сотрудников.

У меня есть модель сотрудника для расширения модели пользователя. Он обладает свойством is_active для возврата значения is_active пользовательской модели.

 class Employee(models.Model):
"""Model representing an employee - one-to-one with user"""
user = models.OneToOneField(User, on_delete=models.CASCADE)

@property
def is_active(self):
    """Property to return active status of user to employee model"""
    return self.user.is_active  
 

У меня есть фильтр свойств, использующий django_property_filter

 class EmployeeFilter(PropertyFilterSet):

ACTIVE_CHOICES = (
(True, 'Active'),
(False, 'Inactive'),
)

active = PropertyChoiceFilter(choices=ACTIVE_CHOICES,field_name='is_active',lookup_expr='exact',label='Active')

class Meta:
    model = Employee
    fields = ['locations']
 

Я использую представление на основе функций для перечисления всех сотрудников.

 def EmployeesList(request):
    
employee=getemployeefromuser(request)
if employee:
    
    emp_list = Employee.objects.filter(hotel__exact=employee.hotel).order_by('user')
    f = EmployeeFilter(request.GET, queryset=emp_list)
    emp_list = f.qs
     
    paginator = Paginator(emp_list, 20)
    page = request.GET.get('page', 1)
    try:
       emps = paginator.page(page)
    except PageNotAnInteger:
       emps = paginator.page(1)
    except EmptyPage:
       emps = paginator.page(paginator.num_pages)

    context = {
    'filter':f,
    'emps':emps,
    }

return render(request, 'staffapp/employee_list.html', context=context)
 

Фильтры отображаются, как и ожидалось. Фильтр местоположения работает правильно. Активный фильтр корректно работает для —-/Нет и Активен/Истина, но когда я выбираю Неактивный, он просто возвращает те же результаты, что и Активный. URL-адрес правильно добавляется «?Active=False» но результирующие записи сотрудников такие же, как и при добавлении «?Активно=Верно».

Обновление: Я могу заставить это функционально работать, если я использую PropertyBooleanFilter вместо PropertyChoiceFilter. Но варианты, представленные пользователю, сбивают с толку (Неизвестно/Да/Нет), поэтому он функционален, но непрактичен.

 #this works but options unknown/yes/no are not intuitive to users
isactive = PropertyBooleanFilter(field_name='is_active',lookup_expr='exact',label='Active')
 

Я не нашел никакого способа переопределить параметры выпадающего списка для PropertyBooleanFilter.

Ответ №1:

Подтвердил разработчику django_property_filter, что это дефект.

Предлагаемое решение состоит в том, чтобы вместо этого использовать логический виджет с property_boolean_filter.

 ACTIVE_CHOICES = (
(None, 'All'),
(True, 'Active'),
(False, 'Inactive'),
)
my_widget = BooleanWidget()
my_widget.choices = ACTIVE_CHOICES

isactive = PropertyBooleanFilter(widget=my_widget, 
field_name='is_active',lookup_expr='exact',label='Active')