Я хотел бы реализовать фильтрацию диапазона дат для модели в Django Admin по значению, которое на самом деле не существует в модели как поле. Я хочу использовать средство выбора диапазона дат, например DateRangeFilter
из пакета django-admin-rangefilter
.
Допустим, в модели есть поле date
и мы хотим отобразить объекты, для которых date - 7
лежит между указанным диапазоном (просто искусственный пример).
Я создал собственный класс фильтра.
class CustomDateFilter(DateRangeFilter):
title = "custom_date"
def queryset(self, request, queryset):
queryset = queryset.annotate(custom_date=F("date") - 7)
if self.form.is_valid():
validated_data = dict(self.form.cleaned_data.items())
if validated_data:
return queryset.filter(
**self._make_query_filter(request, validated_data)
)
return queryset
Но его использование приводит либо к ошибке FieldDoesNotExist ...
, если используется так:
@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
list_filter = [("custom_date", CustomDateFilter)]
or
SystemCheckError: System check identified some issues:
ERRORS:
<class '...SomeModelAdmin'>: (admin.E114) The value of 'list_filter[0]' must not inherit from 'FieldListFilter'.
если использовать так:
@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
list_filter = [CustomDateFilter]
Как я могу достичь того, что я хочу сделать?