2016-06-09 17 views
7

Sono un principiante con Django e ho un modello con un campo DateTime che viene mostrato nell'amministratore di django.Come estendere la classe DateFieldListFilter dell'amministratore di Django?

Nell'opzione list_filter quando ho specificare il nome del campo ho l'interfaccia di base di filtro Django per i campi data con 4 collegamenti (oggi, questo mese, ultimi 7 giorni, ecc)

Ora voglio aggiungere una " prossimo 7 giorni "opzione. Ciò richiederà un piccolo aggiustamento estendendo la classe DateFieldListFilter. Tuttavia, Django lancia il controllo di sistema (admin.E114) Il valore di 'list_filter [0]' non deve ereditare da 'FieldListFilter'. quando cerco di estenderlo

L'unico modo che sembra possibile dopo un po 'di ricerca è l'estensione della classe SimpleListFilter ma sembra un sacco di lavoro per una cosa così piccola. (Dal momento che dovrò duplicare funzionalità già curate in DateFieldListFilter)

C'è un modo più semplice per raggiungere questo obiettivo?

risposta

1

Supponiamo di avere un modello chiamato Book con un campo published_at che è un DateTimeField. È quindi possibile ottenere questo tipo di filtro facendo qualcosa di simile a questo (il codice è basato su DateFieldListFilter come visto in 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), 
    ) 
Problemi correlati