Django 管理列表过滤器删除所有选项

ela*_*ver 7 python django django-admin django-advanced-filters

正如您从下面的屏幕截图中看到的,使用和自定义 django 管理过滤器时,如下所示:

class DealExpiredListFilter(admin.SimpleListFilter):
  title = 'expired'

  parameter_name = 'expired'

  def lookups(self, request, model_admin):
      return (
          ('yes', 'yes'),
          ('no', 'no'),
      )

  def queryset(self, request, queryset):
      if self.value() == "yes":
          return queryset.filter(end_date__lt=timezone.now())
      elif self.value() == "no":
          return queryset.exclude(end_date__lt=timezone.now())
Run Code Online (Sandbox Code Playgroud)

Django 将在任何情况下插入一个“全部”选项(这对于 %99 次都很好)。我想重命名或删除“全部”选项,如截图所示

截图

ela*_*ver 8

我最终通过浏览可以在此链接中找到的源代码并覆盖该choices函数来解决它。我只更改了“全部”选择​​以在添加到我的过滤器类的此代码中显示“是”:

from django.utils.encoding import force_text

def choices(self, changelist):
    """Copied from source code to remove the "All" Option"""
    yield {
        'selected': self.value() is None,
        'query_string': changelist.get_query_string({}, [self.parameter_name]),
        'display': 'Yes',
    }
    for lookup, title in self.lookup_choices:
        yield {
            'selected': self.value() == force_text(lookup),
            'query_string': changelist.get_query_string({self.parameter_name: lookup}, []),
            'display': title,
        }
Run Code Online (Sandbox Code Playgroud)

正如 Linh 提到的:对于任何只想删除 all 选项的人,只需'display': 'Yes'从选择函数中的第一个 yield{} 中删除即可