I would like to implement date range filtering on a model in Django Admin by a value which does not actually exist in the model as a field. I want to use the date range picker like DateRangeFilter from the django-admin-rangefilter package.
Assume, the model has the date field and we would like to display objects, for which date - 7 lies between the specified range (just an artificial example).
I have created a custom filter class.
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
But it's usage leads to either the FieldDoesNotExist ... error if used so:
@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'.
if used so:
@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
list_filter = [CustomDateFilter]
How can I achieve the thing I want to do?