如何为 django_filters DateRangeFilter 函数指定自定义选项?
How can I specify custom choices for the django_filters DateRangeFilter function?
我正在使用 django_filters DateRangeFilter() 函数。我的过滤器 class 看起来像这样:
class ListingFilter(django_filters.FilterSet):
ship_docking = django_filters.DateRangeFilter()
class Meta:
model = Listing
fields = ['orig', 'dest', 'ship_sailing', 'ship_docking']
我想更改范围选择 - 默认选择是今天、昨天、过去 7 天等。如何指定不同的选择列表?
感谢并问候...Paul(Django 新手)
查看 django-filter
和 DateRangeFilter
的源代码,我们可以看到在 __init__
上它检查是否传入了选项集和过滤器集,如果它们是空的,它使用默认值。
class DateRangeFilter(ChoiceFilter):
choices = [
('today', _('Today')),
('yesterday', _('Yesterday')),
('week', _('Past 7 days')),
('month', _('This month')),
('year', _('This year')),
]
filters = {
'today': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
'%s__month' % name: now().month,
'%s__day' % name: now().day
}),
'yesterday': lambda qs, name: qs.filter(**{
'%s__year' % name: (now() - timedelta(days=1)).year,
'%s__month' % name: (now() - timedelta(days=1)).month,
'%s__day' % name: (now() - timedelta(days=1)).day,
}),
'week': lambda qs, name: qs.filter(**{
'%s__gte' % name: _truncate(now() - timedelta(days=7)),
'%s__lt' % name: _truncate(now() + timedelta(days=1)),
}),
'month': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
'%s__month' % name: now().month
}),
'year': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
}),
}
def __init__(self, choices=None, filters=None, *args, **kwargs):
if choices is not None:
self.choices = choices
if filters is not None:
self.filters = filters
您所要做的就是为您的选择创建一个集合列表,然后复制您的自定义过滤器的格式,然后:
class ListingFilter(django_filters.FilterSet):
// Put custom choices and filter variables here
choices = [...]
filters = { ... }
ship_docking = django_filters.DateRangeFilter(choices=choices, filters=filters)
class Meta:
model = Listing
fields = ['orig', 'dest', 'ship_sailing', 'ship_docking']
我正在使用 django_filters DateRangeFilter() 函数。我的过滤器 class 看起来像这样:
class ListingFilter(django_filters.FilterSet):
ship_docking = django_filters.DateRangeFilter()
class Meta:
model = Listing
fields = ['orig', 'dest', 'ship_sailing', 'ship_docking']
我想更改范围选择 - 默认选择是今天、昨天、过去 7 天等。如何指定不同的选择列表?
感谢并问候...Paul(Django 新手)
查看 django-filter
和 DateRangeFilter
的源代码,我们可以看到在 __init__
上它检查是否传入了选项集和过滤器集,如果它们是空的,它使用默认值。
class DateRangeFilter(ChoiceFilter):
choices = [
('today', _('Today')),
('yesterday', _('Yesterday')),
('week', _('Past 7 days')),
('month', _('This month')),
('year', _('This year')),
]
filters = {
'today': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
'%s__month' % name: now().month,
'%s__day' % name: now().day
}),
'yesterday': lambda qs, name: qs.filter(**{
'%s__year' % name: (now() - timedelta(days=1)).year,
'%s__month' % name: (now() - timedelta(days=1)).month,
'%s__day' % name: (now() - timedelta(days=1)).day,
}),
'week': lambda qs, name: qs.filter(**{
'%s__gte' % name: _truncate(now() - timedelta(days=7)),
'%s__lt' % name: _truncate(now() + timedelta(days=1)),
}),
'month': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
'%s__month' % name: now().month
}),
'year': lambda qs, name: qs.filter(**{
'%s__year' % name: now().year,
}),
}
def __init__(self, choices=None, filters=None, *args, **kwargs):
if choices is not None:
self.choices = choices
if filters is not None:
self.filters = filters
您所要做的就是为您的选择创建一个集合列表,然后复制您的自定义过滤器的格式,然后:
class ListingFilter(django_filters.FilterSet):
// Put custom choices and filter variables here
choices = [...]
filters = { ... }
ship_docking = django_filters.DateRangeFilter(choices=choices, filters=filters)
class Meta:
model = Listing
fields = ['orig', 'dest', 'ship_sailing', 'ship_docking']