2016-06-09 87 views
7

我是一个Django的新手,并且有一个带有DateTime字段的模型,它显示在django admin中。如何扩展Django admin的DateFieldListFilter类?

在当我指定的字段名,我得到了基本的Django过滤器接口,可与4个链路(今天,这个月,过去7天等)

日期字段我现在想添加一个“的list_filter选项未来7天“选项。这需要通过扩展DateFieldListFilter类来进行小小的调整。但是,Django抛出系统检查(admin.E114)'list_filter [0]'的值不能从'FieldListFilter'继承。当我试图扩展它。

通过扩展SimpleListFilter类似乎可能在搜索后进行搜索的唯一方法,但对于这么小的事情来说,它似乎有很多工作要做。 (因为我将不得不复制DateFieldListFilter中已经处理好的功能)

是否有更简单的方法来实现此目的?

回答

1

假设我们有一个名为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), 
    )