Django: how to change the choices of AdminTimeWidget

后端 未结 6 1773
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-08 12:29

The AdminTimeWidget rendered in admin for a DateTimeField displays an icon of a clock and when you click you have the choice between: \"Now Midnigh

6条回答
  •  不思量自难忘°
    2020-12-08 12:43

    Subclass AdminTimeWidget to include a modified DateTimeShortcuts.js (get to that in a sec), then subclass AdminSplitDateTime to include your subclassed MyAdminTimeWidget instead of the default Django one:

    from django.contrib.admin.widgets import AdminTimeWidget
    from django.conf import settings
    
    class MyAdminTimeWidget(AdminTimeWidget):
        class Media:
            js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
                  settings.MEDIA_URL + "js/admin/DateTimeShortcuts.js")
    
    class MyAdminSplitDateTime(AdminSplitDateTime):
        def __init__(self, attrs=None):
            widgets = [AdminDateWidget, MyAdminTimeWidget]
            forms.MultiWidget.__init__(self, widgets, attrs)
    

    The secret sauce is in django/contrib/admin/media/js/admin/DateTimeShortcuts.js. This is what creates the list you want to modify. Copy this file and paste it into your project's site_media/js/admin directory. The relevant code you need to modify is on lines 85-88:

    quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + time_format + "'));");
    quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,0,0,0,0).strftime('" + time_format + "'));");
    quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,6,0,0,0).strftime('" + time_format + "'));");
    quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,12,0,0,0).strftime('" + time_format + "'));");
    

    Simply add to/delete from/modify that bit of javascript to your heart's content.

    Finally, attach your new widget to any DateTimeFields you like. Your best bet for that will probably be the formfield_overrides attribute on ModelAdmin:

    class MyModelAdmin(admin.ModelAdmin):
        formfield_overrides = {
            models.DateTimeField: {'widget': MyAdminSplitDateTime},
        }
    

提交回复
热议问题