Chris hat eine großartige Antwort. Als Alternative könnten Sie dies nur mit Javascript tun. Setzen Sie das folgende Javascript auf die Seiten, auf denen Sie die verschiedenen Zeitoptionen haben möchten.
%Vor% Unterklasse AdminTimeWidget
, um eine modifizierte DateTimeShortcuts.js aufzunehmen (zu der in einer Sekunde), dann Unterklasse AdminSplitDateTime
, um die Unterklasse MyAdminTimeWidget
anstelle des Standard-Django zu enthalten:
Die geheime Soße ist in django/contrib/admin/media/js/admin/DateTimeShortcuts.js
. Dadurch wird die Liste erstellt, die Sie ändern möchten. Kopieren Sie diese Datei und fügen Sie sie in das site_media/js/admin
-Verzeichnis Ihres Projekts ein. Der entsprechende Code, den Sie ändern müssen, befindet sich in den Zeilen 85-88:
Einfach hinzufügen / löschen von / ändern Sie das bisschen Javascript nach Herzenslust.
Fügen Sie Ihr neues Widget schließlich an beliebige DateTimeFields an. Ihre beste Wette dafür ist wahrscheinlich das Attribut formfield_overrides
in ModelAdmin
:
Ich habe versucht, diese Methode zu verwenden und festgestellt, dass das oben genannte JavaScript nicht funktionierte, wenn mehrere Datetime im Formular vorhanden waren.
hier ist was ich getan habe.
In meinem ModelAdmin Abschnitt habe ich hinzugefügt:
%Vor%dann in der js-Datei:
%Vor%Hinweis: Ich musste in ein document.ready schreiben, weil ich festgestellt habe, dass ich nicht kontrollieren konnte, wo das Skript in der Seite enthalten war (scheint vor den Standardkalender js-Dateien geladen worden zu sein).
Das Überschreiben der Funktion JS by DateTimeShortcuts.overrideTimeOptions funktioniert nur mit einem Formular (Fehler: Die Änderung der Zeit im Kindmodell wirkt sich auf das Elternmodell aus, so dass Sie das Zeitfeld in der Kindmodellform nicht durch dieses Widget ändern können)
Wenn Sie benutzerdefinierte Zeitoptionen mit Inlines verwenden möchten:
in /static/admin/js/admin/DateTimeShortcuts.js ersetzen:
%Vor%von:
%Vor%Ich ging mit einem viel einfacheren Ansatz und es funktionierte für mich. Ich habe meinem Modell einfach Auswahlmöglichkeiten hinzugefügt, indem ich den folgenden Code verwendete:
class Class(Model):
program = ForeignKey('Program')
time_of_the_day = TimeField(choices=(
(datetime.datetime.strptime('7:00 am', "%I:%M %p").time(), '7:00 am'),
(datetime.datetime.strptime('8:00 am', "%I:%M %p").time(), '8:00 am'),
(datetime.datetime.strptime('9:00 am', "%I:%M %p").time(), '9:00 am'),
(datetime.datetime.strptime('6:00 pm', "%I:%M %p").time(), '6:00 pm'),
(datetime.datetime.strptime('7:00 pm', "%I:%M %p").time(), '7:00 pm'),
(datetime.datetime.strptime('8:00 pm', "%I:%M %p").time(), '8:00 pm'),
(datetime.datetime.strptime('9:00 pm', "%I:%M %p").time(), '9:00 pm'),
))
Hoffe das hilft
Tags und Links django django-forms django-admin