Фильтр по интервалу дат в админке Django

от автора

В текущем проекте появилась потребность фильтровать таблицы в админке Django по условию «от такой-то даты/времени до такой-то даты/времени». К моему удивлению, для такой расхожей задачи при беглом поиске подходящих готовых решений найти не удалось. Может плохо искал, напишите в комментах.

Пришлось изобретать велосипед самому. А недавно выкроил время и оформил этот код в виде отдельной библиотеки.

Используется аналогично штатному фильтру Django по датам.

# admin.py from django.contrib import admin from django_admin_filters import DateRange, DateRangePicker from .models import Log  class Admin(admin.ModelAdmin):     list_display = ['text', 'timestamp1', 'timestamp2']     list_filter = (('timestamp1', DateRange), ('timestamp2', DateRangePicker))  admin.site.register(Log, Admin)

Настраивать под свои нужды можно наследуя библиотечные классы DateRange иDateRangePicker и переопределяя соответствующие атрибуты.

# admin.py from django_admin_filters import DateRange  class MyDateRange(DateRange):     FILTER_LABEL = "Интервал данных"     FROM_LABEL = "От"     TO_LABEL = "До"     ALL_LABEL = 'Все'     CUSTOM_LABEL = "пользовательский"     NULL_LABEL = "без даты"     BUTTON_LABEL = "Задать интервал"     DATE_FORMAT = "YYYY-MM-DD HH:mm"      is_null_option = True      options = (       ('1da', "24 часа вперед", 60 * 60 * 24),       ('1dp', "последние 24 часа", 60 * 60 * -24),     ) 

Список option позволяет задать пункты меню в фильтре вида «от текущего момента на заданное число секунд вперед или назад».

Класс DateRange использует обычные поля input для ввода граничных дат интервала, а класс DateRangePicker — js виджет с календариком. Соответственно, там дополнительно настраиваются элементы этого виджета.

# admin.py from django_admin_filters import DateRangePicker  class MyDateRangePicker(DateRangePicker):     WIDGET_LOCALE = 'ru'     WIDGET_BUTTON_LABEL = "Выбрать"     WIDGET_WITH_TIME = True      WIDGET_START_TITLE = 'Начальная дата'     WIDGET_START_TOP = -350     WIDGET_START_LEFT = -400      WIDGET_END_TITLE = 'Конечная дата'     WIDGET_END_TOP = -350     WIDGET_END_LEFT = -400

Если заинтересовало, то велкам в подробное описание. Спасибо за внимание.


ссылка на оригинал статьи https://habr.com/ru/post/688184/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *