Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为django_filters DateRangeFilter函数指定自定义选项?_Django_Django Filters - Fatal编程技术网

如何为django_filters DateRangeFilter函数指定自定义选项?

如何为django_filters DateRangeFilter函数指定自定义选项?,django,django-filters,Django,Django Filters,我正在使用django_filters DateRangeFilter()函数。我的筛选器类如下所示: class ListingFilter(django_filters.FilterSet): ship_docking = django_filters.DateRangeFilter() class Meta: model = Listing fields = ['orig', 'dest', 'ship_sailing', 'ship_doc

我正在使用django_filters DateRangeFilter()函数。我的筛选器类如下所示:

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筛选器
DateRangeFilter
的源代码,我们可以看到在
\uuuuu init\uuuuu
上,它检查选项集和筛选器集是否已传入,如果它们为空,则使用默认值

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_过滤器源代码中复制_truncate函数,但在其他方面没有问题:def _truncate(dt):return dt.date()