2016-06-09 29 views
7

Jestem nowicjuszem z Django i mam model z polem DateTime, które jest wyświetlane w admin django.Jak rozszerzyć klasę Django o klasę DateFieldListFilter?

W opcji list_filter kiedy sprecyzowania fieldName uzyskać podstawowy interfejs filtra daty Django dla pól z 4 ogniw (dziś, ten miesiąc, ostatnie 7 dni, etc.)

teraz chcę dodać " następna 7-dniowa "opcja. Będzie to wymagało drobnego ulepszenia poprzez rozszerzenie klasy DateFieldListFilter. Jednak Django rzuca sprawdzanie systemu (admin.E114) Wartość "list_filter [0]" nie może dziedziczyć po "FieldListFilter". kiedy próbuję go rozszerzyć.

Jedynym sposobem, w jaki wydaje się to możliwe po niewielkim wyszukiwaniu, jest rozszerzenie klasy SimpleListFilter, ale wydaje się, że przy tak małej rzeczy jest dużo pracy. (ponieważ będę musiał powielić funkcjonalność już zadbaną w DateFieldListFilter)

Czy istnieje prostszy sposób na osiągnięcie tego?

Odpowiedz

1

Załóżmy, że mamy model o nazwie Book z polem published_at, który jest DateTimeField. Następnie można uzyskać tego rodzaju filtrowanie, wykonując coś podobnego (kod jest oparty na DataFieldListFilter, jak widać w 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), 
    )