Skip to content

Instantly share code, notes, and snippets.

@alixedi
Last active August 29, 2015 14:01
Show Gist options
  • Save alixedi/9d4be3e3a274490946df to your computer and use it in GitHub Desktop.
Save alixedi/9d4be3e3a274490946df to your computer and use it in GitHub Desktop.
Custom range django-filters
from django import forms
from django_filters.filterset import FilterSet
from django_filters.widgets import RangeWidget
from django_filters.filters import Filter, RangeFilter
class CustomMultiValueField(forms.MultiValueField):
widget = RangeWidget
def compress(self, data_list):
if data_list:
return slice(*data_list)
return None
class CustomDateRangeField(CustomMultiValueField):
def __init__(self, *args, **kwargs):
fields = (
forms.DateField(),
forms.DateField(),
)
super(DateRangeField, self).__init__(fields, *args, **kwargs)
class CustomTimeRangeField(CustomMultiValueField):
def __init__(self, *args, **kwargs):
fields = (
forms.TimeField(),
forms.TimeField(),
)
super(TimeRangeField, self).__init__(fields, *args, **kwargs)
class CustomDateTimeRangeField(CustomMultiValueField):
def __init__(self, *args, **kwargs):
fields = (
forms.DateTimeField(),
forms.DateTimeField(),
)
super(DateTimeRangeField, self).__init__(fields, *args, **kwargs)
class CustomRangeFilter(Filter):
def filter(self, qs, value):
if value:
lookup = '%s__range' % self.name
return qs.filter(**{lookup: (value.start, value.stop)})
return qs
class CustomDateRangeFilter(CustomRangeFilter):
field_class = DateRangeField
class CustomTimeRangeFilter(CustomRangeFilter):
field_class = TimeRangeField
class CustomDateTimeRangeFilter(CustomRangeFilter):
field_class = DateTimeRangeField
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment