如何扩展Django admin的DateFieldListFilter类?

时间:2016-06-09 20:03:43

标签: python django django-admin

我是Django的新手,并且有一个带有DateTime字段的模型,该字段显示在django admin中。

在list_filter选项中,当我指定fieldname时,我得到了基本的Django过滤器接口,用于包含4个链接的日期字段(今天,本月,过去7天等)

我现在要添加"接下来的7天"选项。这将需要通过扩展DateFieldListFilter类进行微小的调整。但是,Django抛出系统检查(admin.E114)' list_filter [0]'的值。不得继承“FieldListFilter'”。当我试图扩展它。

通过扩展SimpleListFilter类,在一些搜索之后似乎可能的唯一方法,但对于这么小的事情看起来似乎很多工作。 (因为我必须复制已经在DateFieldListFilter中处理的功能)

有没有更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

假设我们有一个名为Book的模型,其published_at字段为DateTimeField。然后你可以通过这样的方式实现这种类型的过滤(代码基于DateFieldListFilter,如https://github.com/django/django/blob/4ad2f862844d35404e4798b3227517625210a72e/django/contrib/admin/filters.py所示):

import datetime

from django.contrib import admin
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 += ((
            (_('Next 7 days'), {
                self.lookup_kwarg_since: str(today),
                self.lookup_kwarg_until: str(today + datetime.timedelta(days=7)),
            }),
        ))

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