Django: Wie ändere ich die Optionen von AdminTimeWidget?

8

Das AdminTimeWidget , das im Admin für ein DateTimeField gerendert wird, zeigt ein Icon einer Uhr an und wenn Sie klicken, haben Sie die Wahl zwischen: "Now Midnight 6:00 Noon".

Wie kann ich diese Auswahl auf "16h 17h 18h" ändern?

    
Mermoz 24.04.2011, 14:08
quelle

5 Antworten

11

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%     
Brian Fisher 13.05.2011, 05:29
quelle
10

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:

%Vor%

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:

%Vor%

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 :

%Vor%     
Chris Pratt 12.05.2011 15:10
quelle
3

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).

    
warath-coder 29.12.2014 02:34
quelle
1

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%     
temasso 21.01.2014 16:27
quelle
1

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

    
Bit68 16.06.2015 13:04
quelle