Subclase AdminTimeWidget
para incluir un DateTimeShortcuts.js modificados (llegar a eso en un segundo), entonces subclase AdminSplitDateTime
incluir su subclase MyAdminTimeWidget
lugar del predeterminado Django uno:
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)
El ingrediente secreto está en django/contrib/admin/media/js/admin/DateTimeShortcuts.js
. Esto es lo que crea la lista que desea modificar. Copie este archivo y péguelo en el directorio site_media/js/admin
de su proyecto. El código en cuestión tiene que modificar es en las líneas 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 + "'));");
sólo tiene que añadir a/eliminar de/modificar ese poco de Javascript al contenido de su corazón.
Finalmente, conecte su nuevo widget a cualquier DateTimeFields que desee. Su mejor apuesta para que, probablemente, será el atributo formfield_overrides
en ModelAdmin
:
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.DateTimeField: {'widget': MyAdminSplitDateTime},
}
En realidad, eso es bastante elegante. Dado que el único punto en la subclasificación es anular el JS que se está utilizando, su enfoque es probablemente el mejor. –
Gracias, me gustó tu solución también. Mi solución usa menos código, pero parece menos intencional que la tuya. Traté de pensar qué solución sería más fácil de mantener con el tiempo, en particular, ya que Django sí mismo se actualizó. Me gustó el tuyo porque dejaba muy claro lo que estaba sucediendo. Me gustó que la mina se pudiera implementar sin duplicar ninguno de los archivos de Django. Realmente no podía entender qué camino era más fácil de mantener, así que pensé en publicar la solución y dejar que la gente evaluara este enfoque. –