В текущем проекте появилась потребность фильтровать таблицы в админке 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
Если заинтересовало, то велкам в подробное описание. Спасибо за внимание.
am198102
.