在admin中爲DateTimeField
呈現的AdminTimeWidget
會顯示一個時鐘圖標,當您單擊時您可以選擇:「現在午夜6:00中午」。Django:如何更改AdminTimeWidget的選項
如何將這些選項更改爲「16h 17h 18h」?
在admin中爲DateTimeField
呈現的AdminTimeWidget
會顯示一個時鐘圖標,當您單擊時您可以選擇:「現在午夜6:00中午」。Django:如何更改AdminTimeWidget的選項
如何將這些選項更改爲「16h 17h 18h」?
克里斯有着極大的答案。作爲一種替代方法,您可以使用javascript來做到這一點。將下列JavaScript放在您想要不同時間選項的頁面上。
DateTimeShortcuts.overrideTimeOptions = function() {
// Find the first time element
timeElement = django.jQuery("ul.timelist li").eq(0).clone();
originalHref = timeElement.find('a').attr('href');
// remove all existing time elements
django.jQuery("ul.timelist li").remove();
// add new time elements representing those you want
var i=0;
for (i=0;i<=23;i++) {
// use a regular expression to update the link
newHref = originalHref.replace(/Date\([^\)]*\)/g, "Date(1970,1,1," + i + ",0,0,0)");
// update the text for the element
timeElement.find('a').attr('href', newHref).text(i+"h");
// Add the new element into the document
django.jQuery("ul.timelist").append(timeElement.clone());
}
}
addEvent(window, 'load', DateTimeShortcuts.overrideTimeOptions);
子類AdminTimeWidget
包括修改DateTimeShortcuts.js(去,在一個秒),然後繼承AdminSplitDateTime
包括您的子類MyAdminTimeWidget
而不是默認的Django一個:
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)
的祕訣是django/contrib/admin/media/js/admin/DateTimeShortcuts.js
。這就是創建你想要修改的列表。複製此文件並將其粘貼到您的項目的site_media/js/admin
目錄中。您需要修改的相關代碼位於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 + "'));");
只需在JavaScript的內容中添加/刪除/修改該位的javascript即可。
最後,將您的新小部件附加到您喜歡的任何DateTimeField。爲您最好的選擇可能會是在ModelAdmin
的formfield_overrides
屬性:
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.DateTimeField: {'widget': MyAdminSplitDateTime},
}
重寫JS通過DateTimeShortcuts.overrideTimeOptions功能只適用於一種形式 (錯誤:在兒童模式時間的變化會影響母公司的模式,所以你不能用這個小部件更改子模型的形式timefield )
如果你想使用自定義的時間選擇與內聯:
在/static/admin/js/admin/DateTimeShortcuts.js 取代:
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 + "'));");
由:
for(j=6;j<=23;j++){
quickElement("a", quickElement("li", time_list, ""), j+":00", "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1," + j + ",0,0,0).strftime('" + time_format + "'));");
}
我嘗試使用這種方法,發現當多個日期時間的存在形式對以上的JavaScript沒有工作。
這是我做的。
在我的ModelAdmin節我說:
class Media:
js = ('js/clock_time_selections.js',)
然後在js文件:
$('document').ready(function() {
DateTimeShortcuts.overrideTimeOptions = function() {
var clockCount = 0;
console.log('ready');
$('ul.timelist').each(function() {
var $this = $(this);
var originalHref = $this.find('a').attr('href');
console.log(originalHref);
$this.find('li').remove();
for (i=8; i <= 20; i++) {
var newLink = '<li><a href="javascript:DateTimeShortcuts.handleClockQuicklink('+ clockCount + ', ' + i
+ ');"> ' + i + ':00h</a></li>';
$this.append(newLink);
}
//console.log($this.html());
clockCount++;
});
};
addEvent(window, 'load', DateTimeShortcuts.overrideTimeOptions);
});
注:我不得不把裏面的document.ready因爲我發現我做不到控制腳本包含在頁面中的位置(似乎已在默認日曆js文件之前加載)。
我走了一個更簡單的方法,它爲我工作。我簡單地使用下面的代碼添加到選擇我的模型:
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'),
))
希望這有助於
其實,這是相當優雅。由於子類中唯一的一點是重寫正在使用的JS,所以你的方法實際上可能是更好的方法。 – 2011-05-13 15:02:14
謝謝,我也很喜歡你的解決方案。我的解決方案使用較少的代碼,但似乎不如您的意圖。我試着想,隨着時間的推移,哪種解決方案更容易維護,特別是在Django本身升級後。我喜歡你的,因爲它很清楚發生了什麼。我喜歡我可以在不重複任何Django文件的情況下實現。我無法弄清楚哪種方式更易維護,所以我想我會發布解決方案,並讓人羣評估這種方法。 – 2011-05-13 15:34:06