
В текущем проекте появилась потребность фильтровать таблицы в админке 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/
Добавить комментарий