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

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

Комментарии (4)


  1. am198102
    14.09.2022 13:06

    .


  1. rSedoy
    14.09.2022 13:56
    +1

    Может плохо искал, напишите в комментах

    https://pypi.org/project/django-admin-rangefilter/


    1. vb64 Автор
      14.09.2022 14:08

      Этого не видел, спасибо.

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


      1. rSedoy
        14.09.2022 14:24

        время там есть, а шорткаты и без библиотеки без особых проблем делаются