首页 > 解决方案 > 为自定义“即将到来”过滤器扩展 Django-admin 的 DateFieldListFilter

问题描述

我正在尝试向 Django Admin DateFieldListFilter 添加一个自定义的“即将到来的”过滤器。这很简单,只需选择今天之后的日期。在这个线程的基础上,我能够将 Django 的标准 DateFieldListFilter 扩展为我自己的自定义项,如下所示:

class MyDateTimeFilter(DateFieldListFilter):

    def __init__(self, *args, **kwargs):
        super(MyDateTimeFilter, self).__init__(*args, **kwargs)

        today = datetime.now()    
        self.links += (('Upcoming'), {self.lookup_kwarg_since: today.strftime('%d %B %Y')}),

它在我的过滤器底部正确显示“即将到来”,但单击实际上并没有过滤结果。我不知道我的语法有什么问题,我尝试了很多替代方法......

非常感激您的帮忙!

PS:我正在使用 Python 3.5.2 和 Django 2.0.6

标签: pythondjangodjango-admindjango-admin-filters

解决方案


没有直接跳到这个,我已经完成了你之前项目所需要的:

filters.py

import datetime

from django.contrib.admin.filters import DateFieldListFilter
from django.utils.translation import gettext_lazy as _

class MyDateTimeFilter(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)

        today = now.date()

        self.links += ((
            (_('Upcoming'), {
                self.lookup_kwarg_since: str(today),
                self.lookup_kwarg_until: str(today + datetime.timedelta(days=7)),
            }),
        ))

您想添加一些稍后使用的声明(例如,today = now.date()),然后您想使用self.lookup_kwarg_until关键字参数,并在日期之前有一些时间范围作为您的查找(为方便起见,我使用了today + datetime.timedelta(days=7),但您可以很容易地配置它到您需要的任何时间跨度。

然后你需要这样的东西admin.py

from django.contrib import admin

from filters import MyDateTimeFilter

class PostAdmin(admin.ModelAdmin):
    list_filter = (
        ('published_at', MyDateTimeFilter()),
    )

免责声明:这适用于 Python 3.7、Django 2.0*。手指交叉这对你有用!


推荐阅读