繁体   English   中英

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

[英]Extending Django-admin's DateFieldListFilter for custom “Upcoming” filter

我正在尝试向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

无需直接进入这一阶段,我已经完全完成了上一个项目所需的工作:

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关键字参数,并有一些时间范围作为直到日期的查找(为方便self.lookup_kwarg_until ,我已经使用了today + datetime.timedelta(days=7) ,但是您可以很容易地将其配置为所需的任何时间跨度。

然后,您需要在admin.pyadmin.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 *。 手指交叉为您工作!

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

我错过了在_我的语法,我试图直接在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的原始代码(可能不建议这样做,但对我而言是无害的),并且效果很好。 我无法扩展原始过滤器,但可以覆盖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM