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
будет переопределять опции.