How to implement date range filter in Django Admin using custom field?

Viewed 1248

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?

0 Answers
Related