将 'yesterday' 字段添加到 Django 管理日期列表过滤器

Add 'yesterday' field to Django admin date list filter

在我的 Django 应用程序中,在管理员中,对于我的一个模型,我允许选项按其 'create_date' 字段进行过滤。默认情况下,Django 会为我提供一些选项(今天、过去 7 天、本月、今年)。我也想简单地添加选择 'Yesterday' 的选项。我查看了关于同一问题的其他 Stack overflow 问题,但他们都在寻找按日期范围搜索的功能,而我只想要一个预加载选项。他们在管理员 class 中配置此模型以覆盖其某些过滤器功能的方法吗?

管理员Class

class User_LikeAdmin(admin.ModelAdmin):
    def fb_view_link(self, obj):
        if len(obj.user_facebook_link) > 2:
            return u"<a href='%s' target='_blank'>Facebook Page</a>" % obj.user_facebook_link
        else:
            return ""

    fb_view_link.short_description = ''
    fb_view_link.allow_tags = True


    list_display = ('vehicle', 'user', 'fb_view_link', 'dealer', 'create_date')
    list_filter = ('create_date', ('vehicle__dealer', custom_titled_filter('Dealer')))
    raw_id_fields = ('vehicle', 'user')

    actions = [export_csv]

    def dealer(self, obj):
        return obj.vehicle.dealer

使用日期时间,并创建昨天变量,然后以此方式获取所有记录。

import datetime
yesterday = datetime.date.today() - datetime.timedelta(days=1)

data = Modelname.objects.filter(create_date=yesterday)

作为一个选项,您可以使用 documentation

中提到的自定义过滤器 class
class User_LikeAdmin(admin.ModelAdmin):
    list_filter = (('create_date', CustomDateFieldListFilter),)

您可以扩展 DateFieldListFilter

from django.contrib.admin.filters import DateFieldListFilter

class CustomDateFieldListFilter(DateFieldListFilter):
    # Your tweaks here

我的@d2718nis 版本是回答:

class DateFilter(DateFieldListFilter):
    def __init__(self, field, request, params, model, model_admin, field_path):
        super().__init__(field, request, params, model, model_admin, field_path)

        now = timezone.now()
        if timezone.is_aware(now):
            now = timezone.localtime(now)

        if isinstance(field, models.DateTimeField):
            today = now.replace(hour=0, minute=0, second=0, microsecond=0)
        else:       # field is a models.DateField
            today = now.date()

        yesterday = today - datetime.timedelta(days=1)

        links_start = self.links[:2]  # anyday and today
        link_yesterday = (_('Yesterday'), {
                self.lookup_kwarg_since: str(yesterday),
                self.lookup_kwarg_until: str(today),
            })

        self.links = (*links_start, link_yesterday, *self.links[2:])
import datetime
from django.contrib.admin import DateFieldListFilter


class DateYesterdayFieldListFilter(DateFieldListFilter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        today = datetime.date.today()
        yesterday = today - datetime.timedelta(days=1)

        self.links = list(self.links)
        self.links.insert(2, ('Yesterday', {
            self.lookup_kwarg_since: str(yesterday),
            self.lookup_kwarg_until: str(today),
        }))