Python Django SimpleListFilter双选项自定义查询

Python Django SimpleListFilter双选项自定义查询,python,django,django-admin,Python,Django,Django Admin,我目前正在尝试编写一个SimpleListFilter,它需要有2个选择字段来选择筛选对象的当前状态以及需要筛选的当前日期范围,然后加入这2个值,在对象上创建一个自定义筛选器,以获得所需的属性 当前问题是由第一个筛选器创建的,该筛选器将is筛选器添加到url,并且在应用第二个筛选器后不需要此筛选器 我还尝试使用request.GET.pop('entered_state')弹出过滤器,但python返回一个错误: In [1]: request Out[1]: <WSGIRequest:

我目前正在尝试编写一个SimpleListFilter,它需要有2个选择字段来选择筛选对象的当前状态以及需要筛选的当前日期范围,然后加入这2个值,在对象上创建一个自定义筛选器,以获得所需的属性

当前问题是由第一个筛选器创建的,该筛选器将is筛选器添加到url,并且在应用第二个筛选器后不需要此筛选器

我还尝试使用request.GET.pop('entered_state')弹出过滤器,但python返回一个错误:

In [1]: request
Out[1]: <WSGIRequest: GET '/admin/requests/request/?entered_state=completed&entered_state_at=2_week'>

In [2]: request.GET.pop('entered_state')
AttributeError: This QueryDict instance is immutable
类EnteredStateAtFilter(admin.SimpleListFilter):


QueryDict实例是不可变的,所以如果要弹出它,应该将其设置为True,即
request.GET.\u mutable。但下面更好

request.GET.GET('entered_state')

class EnteredStateFilter(admin.SimpleListFilter):

   title = _('Entered State')
   parameter_name = 'entered_state'

   def lookups(self, request, model_admin):
       return (
          ('completed',  _('Completed')),
          ('denied',     _('Denied')),
          ('expired',    _('Expired')),
          ('cancelled',  _('Cancelled'))
        )

   def queryset(self, request, queryset):
       return queryset
title = _('Entered State at')
parameter_name = 'entered_state_at'

def lookups(self, request, model_admin):
    return (
        ('today',_('Today')),
        ('1_week',_('Past 7 days')),
        ('2_week',_('This month')),
        ('3_week',_('This year')),
    )


def queryset(self, request, queryset):
    entered_state = request.GET.get('entered_state')
    today = datetime.now().date()

    if entered_state != None:
        if self.value() == 'today':
            kwargs ={'entered_{}_at__date'.format(entered_state):today}
            return queryset.filter(**kwargs)
        elif self.value() == 'Past 7 days':
            kwargs ={'entered_{}_at__date__gte'.format(entered_state):today-relativedelta(weeks=1)}
            return queryset.filter(**kwargs)
        elif self.value() == 'Past month':
           kwargs ={'entered_{}_at__date__gte'.format(entered_state):today-relativedelta(months=1)}
           return queryset.filter(**kwargs)
        elif self.value() == 'Past year':
           kwargs ={'entered_{}_at__date__gte'.format(entered_state):today.replace(month=1, day=1)}
           return queryset.filter(**kwargs)

    return queryset