我正在尝试向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
答案 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的原始代码(可能不建议这样做,但对我而言是无害的),并且效果很好。我无法扩展原始过滤器,但可以对其进行覆盖。