如何在Django admin中基于月份和年份创建自定义列表过滤器

时间:2017-06-14 05:53:33

标签: python django

我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

import time
from tkinter import *
from tkinter import messagebox


print("Testing program")
time.sleep(5)
print("Program tested")
window=Tk()
window.withdraw()
messagebox.showinfo('Successful','Script executed successfully')
window.deiconify()
window.destroy()
window.quit()

这不是理想的解决方案,但我想比每个月安装一个软件包进行过滤要好

结果(由于我在2019年没有任何数据,因此仅显示2020: example of filter in wagtail