2011-04-24 42 views

回答

11

克里斯有着極大的答案。作爲一種替代方法,您可以使用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); 
+0

其實,這是相當優雅。由於子類中唯一的一點是重寫正在使用的JS,所以你的方法實際上可能是更好的方法。 – 2011-05-13 15:02:14

+0

謝謝,我也很喜歡你的解決方案。我的解決方案使用較少的代碼,但似乎不如您的意圖。我試着想,隨着時間的推移,哪種解決方案更容易維護,特別是在Django本身升級後。我喜歡你的,因爲它很清楚發生了什麼。我喜歡我可以在不重複任何Django文件的情況下實現。我無法弄清楚哪種方式更易維護,所以我想我會發布解決方案,並讓人羣評估這種方法。 – 2011-05-13 15:34:06

10

子類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。爲您最好的選擇可能會是在ModelAdminformfield_overrides屬性:

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

重寫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 + "'));"); 
} 
3

我嘗試使用這種方法,發現當多個日期時間的存在形式對以上的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文件之前加載)。

1

我走了一個更簡單的方法,它爲我工作。我簡單地使用下面的代碼添加到選擇我的模型:

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'),
))

希望這有助於

+0

你確定嗎?我收到一個錯誤,指出'選擇'對'TimeField'是一個無效的選項。 – raratiru 2017-10-25 21:20:32

+0

在2015年爲我工作,也許當前版本不允許。這個片段的項目仍然運行起來。 – Bit68 2017-10-26 10:20:11

+1

我必須再次檢查以防萬一我拼寫錯誤,您的想法很棒。 – raratiru 2017-10-26 11:28:39