【问题标题】:How to create custom list filters based on month and year in Django admin如何在 Django admin 中基于月份和年份创建自定义列表过滤器
【发布时间】:2017-11-16 02:48:37
【问题描述】:

我有一个 Django 模型,它有一个日期字段,我想创建一个列表过滤器,它将显示以下选项,

当前

2017

2016

2015

点击年份链接后,它将折叠成月份,

2017

01

02

03

04 ...

我尝试了默认的DateFieldListFilter,但它只有以下选项,

任何

今天

过去 7 天

本月

今年

我尝试使用 SimpleListFilter 解决此问题,但未能成功。

class MonthFilter(admin.SimpleListFilter):
    title = 'Month'
    parameter_name = 'month'
    def lookups(self, request, model_admin):
        months = [["current", "Current"]]
        qs = model_admin.model.objects.exclude(ts_from=None).order_by('ts_from')
        last= qs[0]
        last_year = last.ts_from.year
        current = timezone.now()
        current_year = current.year
        months.append([current_year, current_year])
        months.append([last_year, last_year])
        return months

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(ts_from__contains=self.value())
        else:
            return queryset

【问题讨论】:

    标签: python django


    【解决方案1】:

    我猜你还没有在查询集中使用月份进行过滤

    def queryset(self, request, queryset):
        month = request.GET.get('month') or datetime.now().month
        if self.value():
            return queryset.filter(ts_from__contains=self.value(), created__month=month)
        else:
            return queryset
    

    【讨论】:

      【解决方案2】:

      我制作了 2 个过滤器,一个用于一年,另一个用于一个月:

      class YearFilter(SimpleListFilter):
          title = _("Year")
          parameter_name = _("year")
      
          def lookups(self, request: HttpRequest, model_admin: ModelAdmin) -> list:
              qs = model_admin.model.objects.exclude(ts_from=None).order_by(
                  "ts_from"
              )
              first_year = qs[0].ts_from.year
              current_year = datetime.now().year
              return [(y, y) for y in range(first_year, current_year + 1)]
      
          def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
              if self.value():
                  return queryset.filter(ts_from__year=self.value())
              else:
                  return queryset
      
      
      class MonthFilter(SimpleListFilter):
          title = _("Month")
          parameter_name = _("month")
      
          def lookups(self, request: HttpRequest, model_admin: ModelAdmin) -> list:
              return [(m, m) for m in range(1, 13)]
      
          def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
              if self.value():
                  return queryset.filter(ts_from__month=self.value())
              else:
                  return queryset
      

      这不是一个理想的解决方案,但我想比安装一个包来过滤每月更好

      结果(它仅显示 2020 年,因为我在 2019 年没有任何数据:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-01
        • 2018-10-15
        • 2014-11-26
        • 2021-10-16
        • 1970-01-01
        • 2018-03-23
        • 2021-05-18
        相关资源
        最近更新 更多