2017-02-08 6 views
1

Я пытаюсь написать поле диапазона дат для администратора Django. Это мой фильтр, который очень похож на пример десятилетия, представленный в docs, но не работает для меня. Что я делаю не так? Он просто показывает все записи для каждого выбора.Django admin date range filter

class DaysSinceAdvertFilter(admin.SimpleListFilter): 
    # Human-readable title which will be displayed in the 
    # right admin sidebar just above the filter options. 
    title = _('Days Since Advert') 

    # Parameter for the filter that will be used in the URL query. 
    parameter_name = 'last_advert' 

    def lookups(self, request, model_admin): 
     """ 
     Returns a list of tuples. The first element in each 
     tuple is the coded value for the option that will 
     appear in the URL query. The second element is the 
     human-readable name for the option that will appear 
     in the right sidebar. 
     """ 
     return (
      ('0', _('Less than 7 days')), 
      ('7', _('7-13 days')), 
      ('14', _('14-20 days')), 
      ('21', _('21-27 days')), 
      ('28', _('28-34 days')), 
      ('35', _('35+ days')), 
     ) 

    def queryset(self, request, queryset): 
     """ 
     Returns the filtered queryset based on the value 
     provided in the query string and retrievable via 
     `self.value()`. 
     """ 
     # Compare the requested value to decide how to filter the queryset. 
     today = datetime.date.today() 
     if self.value() == '0': 
      return queryset.filter(last_advert__gte=today - datetime.timedelta(days=6)) 
     if self.value() == '7': 
      return queryset.filter(last_advert__gte=today - datetime.timedelta(days=13), 
            last_advert__lte=today - datetime.timedelta(days=7)) 
     if self.value() == '14': 
      return queryset.filter(last_advert__gte=today - datetime.timedelta(days=20), 
            last_advert__lte=today - datetime.timedelta(days=14)) 
     if self.value() == '21': 
      return queryset.filter(last_advert__gte=today - datetime.timedelta(days=27), 
            last_advert__lte=today - datetime.timedelta(days=21)) 
     if self.value() == '28': 
      return queryset.filter(last_advert__gte=today - datetime.timedelta(days=34), 
            last_advert__lte=today - datetime.timedelta(days=28)) 
     if self.value() == '35': 
      return queryset.filter(last_advert__lte=today - datetime.timedelta(days=35)) 

last_advert является models.DateField

ответ

1

Вы можете просто использовать last_advert__range создать Dict для диапазонов ваших же, как кортеж, которые вы создали в lookups() Некоторые вещи, как этот

no_of_routes_dict = { 
    '7': [14, 20]} 

и в queryset()

filt_no_of_routes=request.GET.get['para'] 
`last_advert__range`= no_of_routes_dict[filt_no_of_routes] 

Это может помочь

class NumberOfRoutesFilter(SimpleListFilter): 
title = 'Date Range' 
parameter_name = 'date-range' 
date_dict = { 
    '0': [0, 7], 
    '7': [7, 13], 
    '14': [14, 20], 
    '21': [21, 27], 

} 

def lookups(self, request, model_admin): 
    return [ 
     ('0', 'Less than 7 days'), 
     ('7', '7-13 days'), 
     ('14', '14-20 days'), 
     ('21', '21-27 days') 
    ] 

def queryset(self, request, queryset): 
    filt_date = request.GET.get('date-range') 
    if filt_date: 
     return queryset.filter(
      last_advert__range=self.date_dict[filt_date] 
     ) 
    return queryset 
+1

Я не понимаю. last_advert - это дата, а не число, но предположительно я могу использовать даты вместо чисел в вашем поиске, но как это реализовать в админ-фильме? – HenryM

+0

Я отредактировал свой ответ. –