将 '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),
}))
在我的 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
中提到的自定义过滤器 classclass 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),
}))