[英]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.py
中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 *。 手指交叉为您工作!
谢谢您的回答,它无疑为我指明了正确的方向。
我错过了在_我的语法,我试图直接在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.