为自定义“即将到来的”过滤器扩展Django-admin的DateFieldListFilter

时间:2018-08-22 21:36:52

标签: python django django-admin django-admin-filters

我正在尝试向Django Admin DateFieldListFilter添加自定义“即将到来的”过滤器。这非常简单,只需选择今天之后的日期即可。在this thread的基础上,我能够将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

2 个答案:

答案 0 :(得分:1)

我并没有直接进入该项目,而是完全完成了上一个项目所需的工作:

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 *。手指交叉为您工作!

答案 1 :(得分:0)

谢谢您的回答,它无疑为我指明了正确的方向。

我的语法中缺少_,我试图直接在 admin.py 中而不是在 filters.py 中创建自定义过滤器。由于我不确定您是指Django源文件 django.contrib.admin.filters.py 还是新创建的 model.filters.py 文件,因此我尝试了两种方法,添加自定义过滤器,然后导入均由于某些原因而无法正常工作,我有以下错误代码:

  TypeError: __init__() missing 6 required positional arguments: 'field', 'request', 'params', 'model', 'model_admin', and 'field_path'

这就像我的 init 声明不完整。

但是,鉴于我找到了Django过滤器的原始源文件,因此我能够调整Django的原始代码(可能不建议这样做,但对我而言是无害的),并且效果很好。我无法扩展原始过滤器,但可以对其进行覆盖。