2015-06-15 3 views
0

После документации Джанго мне нужен SimpleListFilter подкласс очень похож, как один описано there:Пользовательские SimpleListFilter Подкласс для DjangoAdmin

from datetime import date 

from django.utils.translation import ugettext_lazy as _ 
from django.contrib.admin import SimpleListFilter 

class DecadeBornListFilter(SimpleListFilter): 
    # Human-readable title which will be displayed in the 
    # right admin sidebar just above the filter options. 
    title = _('decade born') 

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

    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 (
      ('80s', _('in the eighties')), 
      ('90s', _('in the nineties')), 
     ) 

    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 (either '80s' or 'other') 
     # to decide how to filter the queryset. 
     if self.value() == '80s': 
      return queryset.filter(birthday__gte=date(1980, 1, 1), 
            birthday__lte=date(1989, 12, 31)) 
     if self.value() == '90s': 
      return queryset.filter(birthday__gte=date(1990, 1, 1), 
            birthday__lte=date(1999, 12, 31)) 

class PersonAdmin(ModelAdmin): 
    list_filter = (DecadeBornListFilter,) 

Единственное изменение, которое я должен сделать это в метод поиска, вместо перечисления десятилетий, таких как 80 или 90-е, я бы хотел показать виджеты, чтобы выбрать месяц и год, например JAN, 2000.

В лучшем случае я хотел бы сделать это, используя два раскрывающихся меню, один на год и другой на месяц , Другой альтернативой будет повторное использование диапазона дат, такого как DateRangeFilter, который я пробовал, но я не смог создать новый класс фильтра, наследующий DateRangeFilter, или используя DateRangeFilter в методе поиска нового класса фильтра.

Я использую Django 1.7.8, любая помощь или подсказка будут очень оценены.

ответ

1

Вам нужно два списка_фильтров: один для максимальной даты и один для минимальной даты. Запросите свои записи за все отчетные годы. Что-то вроде этого:

class MaxDateListFilter(SimpleListFilter): 
    title = _('maximum date') 
    parameter_name = 'max_date' 

    def lookups(self, request, model_admin): 
     return [(str(year.year), year.year) \ 
       for year in Entry.objects.dates('pub_date', 'year')] 

    def queryset(self, request, queryset): 
     return queryset.filter(pub_date__year__lte=self.value()) 

Примечание: непроверенный код.

Это будет работать для небольших диапазонов. Но может быть непрактичным с большими наборами данных.

Альтернатива - предоставить свой собственный ModelAdmin.get_search_results и принять его с помощью поисковых запросов по дате. Как только вы это сделаете, вам нужно отобразить собственный ModelAdmin.changelist_view. Добавьте форму в контекст и настройте шаблон списка изменений, чтобы отобразить эту форму. Отправка формы должна привести к правильному запросу GET поиска.

Смежные вопросы