Django - Добавление дополнительных опций в AdminTimeWidget

Я пытался добавить больше вариантов времени в AdminTimeWidget, переопределив DateTimeShortcuts, ссылаясь на этот пост, а также другие подобные посты на SO. Моя проблема в том, что я получаю Uncaught ReferenceError: DateTimeShortcuts is not defined и jQuery.Deferred exception: DateTimeShortcuts is not defined ReferenceError: DateTimeShortcuts is not defined at HTMLDocument ошибки в консоли. Я новичок в django, я не понял, почему я получаю эту ошибку. Вот как я это реализовал:

(function($) {
    $(document).ready(function() {
        DateTimeShortcuts.clockHours.default_ = [
            ['16:30', 16.5],
            ['17:30', 17.5],
            ['18:00', 18],
            ['19:00', 19],
            ['20:00', 20],
        ];

        DateTimeShortcuts.handleClockQuicklink = function (num, val) {
            let d;
            if (val == -1) {
                d = DateTimeShortcuts.now();
            } else {
                const h = val | 0;
                const m = (val - h) * 60;
                d = new Date(1970, 1, 1, h, m, 0, 0);
            }
            DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
            DateTimeShortcuts.clockInputs[num].focus();
            DateTimeShortcuts.dismissClock(num);
        };
    });
})(jQuery);

и в ModelAdmin я включил этот JS-файл в класс Media, как показано ниже:

@admin.register(models.MyModel)
class MyAdminModel():
   // other stuff
   list_filter = [("created", custom_titled_datetime_range_filter("By created"))]

   class Media:
        js = ("admin/js/DateTimeShortcuts.js",)

Кроме того, у меня есть пользовательский фильтр диапазона дат, реализованный следующим образом:

def custom_titled_datetime_range_filter(title):
    class CustomDateTimeRangeFilter(DateTimeRangeFilter):
        def __init__(self, field, request, params, model, model_admin, field_path):
            super().__init__(field, request, params, model, model_admin, field_path)
            self.title = title

    return CustomDateTimeRangeFilter

После просмотра исходного кода DateTimeShortcuts, я должен включить calendar.js и DateTimeShortcuts.js в мою модель администратора как Media. Вот как я расширил опции:

(function($) {
    $(document).ready(function () {
        // push your custom options to `_default`
        DateTimeShortcuts.clockHours.default_.push([gettext_noop('3:30 p.m.'), 15.5]);

        DateTimeShortcuts.handleClockQuicklink = function (num, val) {
            let d;
            if (val == -1) {
                d = DateTimeShortcuts.now();
            } else {
                const h = val | 0;
                const m = (val - h) * 60;
                d = new Date(1970, 1, 1, h, m, 0, 0);
            }
            DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
            DateTimeShortcuts.clockInputs[num].focus();
            DateTimeShortcuts.dismissClock(num);
        };
    });
})(django.jQuery);

и в Model Admin включите эти файлы:

@admin.register(models.MyModel)
class MyAdminModel():

   class Media:
        js = (
            "admin/js/calendar.js",
            "admin/js/admin/DateTimeShortcuts.js",
            "admin/js/time-shortcuts.js",
        )

Теперь все файлы зависимостей будут загружаться по порядку, а time-shortcuts.js будет переопределять опции.

Вернуться на верх