Django 自定义筛选器:重写DateFieldListFilter

 

class MyDateTimeFilter(admin.filters.DateFieldListFilter):
    def __init__(self, *args, **kwargs):
        super(MyDateTimeFilter, self).__init__(*args, **kwargs)

        now = timezone.now()
        # When time zone support is enabled, convert "now" to the user's time
        # zone so Django's definition of "Today" matches what the user expects.
        if timezone.is_aware(now):
            now = timezone.localtime(now)

        filter_end_date = now.replace(hour=0, minute=0, second=0, microsecond=0)

        filter_start_date_for_one_week = filter_end_date - datetime.timedelta(days=7)

        month_with_day31 = [1,3,5,7,8,10,12]
        if filter_end_date.month in month_with_day31 and filter_end_date.day == 31 and filter_end_date.month != 3:
            if filter_end_date.month == 1:
                filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=30)
        elif filter_end_date.month == 3 and filter_end_date.day in [29, 30, 31]:
            if is_leap_year(filter_end_date.year):
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=29)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=28)
        else:
            if filter_end_date.month == 1:
                filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
            else:
                filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1)
        
        filter_start_date_for_six_month = ''
        filter_start_date_for_six_month_month = (filter_end_date.month - 6 + 12) % 12
        if filter_start_date_for_six_month_month == 0:
            filter_start_date_for_six_month_month = 12
        if filter_start_date_for_six_month_month in month_with_day31:
            if filter_end_date.month > 6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)
        elif filter_start_date_for_six_month_month == 2:
            if filter_end_date.day in [29, 30, 31]:
                if is_leap_year(filter_end_date.year):
                    filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=29)
                else:
                    filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=28)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
        else:
            if filter_end_date.day == 31 and filter_end_date.month >6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=30)
            elif filter_end_date.day == 31 and filter_end_date.month <=6:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month, day=30)
            elif filter_end_date.day <31 and filter_end_date.month >6:
                filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
            else:
                filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)

        filter_end_date =  filter_end_date + datetime.timedelta(days=1)

        self.links = ((
            ('------', {}),
            ('Past week', {
                self.lookup_kwarg_since: str(filter_start_date_for_one_week),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('Past month', {
                self.lookup_kwarg_since: str(filter_start_date_for_one_month),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('Past 6 months', {
                self.lookup_kwarg_since: str(filter_start_date_for_six_month),
                self.lookup_kwarg_until: str(filter_end_date),
            }),
            ('All', {}),
        ))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值