2011-04-24 2 views

답변

11

크리스는 좋은 답을 가지고있다. 대안으로 당신은 자바 스크립트를 사용하여 이것을 할 수 있습니다. 다른 시간 옵션을 원하는 페이지에 다음 javascript를 추가하십시오. 기능은 하나 개의 형태 (버그와 함께 작동DateTimeShortcuts.overrideTimeOptions에 의해

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를 오버라이드하는 것이므로 실제로는 더 나은 방법 일 것입니다. –

+0

감사합니다. 귀하의 솔루션 역시 마음에 들었습니다. 내 솔루션은 코드를 적게 사용하지만 사용자보다 덜 의도적 인 것처럼 보입니다. Django 자체가 업그레이드됨에 따라 어느 솔루션이 시간이 지남에 따라 유지하기가 더 쉬울 지 생각했습니다. 무슨 일이 일어나고 있었는지 분명히했기 때문에 나는 네가 좋아했다. Django 파일을 복제하지 않고 구현할 수 있다고 생각했습니다. 나는 어느 방법이 더 정비 가능했는지 알 수 없었기 때문에 해결책을 게시하고 군중들이이 접근법을 평가하게 할 것이라고 생각했습니다. –

10

서브 클래스 AdminTimeWidget의 (a 초에 그 얻을), 다음을 포함하는 AdminSplitDateTime를 서브 클래스 수정 DateTimeShortcuts.js을 포함하는 대신 기본 장고 하나의 MyAdminTimeWidget를 서브 클래스 :

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 + "'));"); 

는 간단히 /에서 삭제/추가 당신의 마음의 콘텐츠를 자바 스크립트의 비트를 수정합니다.

마지막으로 새 위젯을 원하는 모든 DateTimeField에 연결하십시오. 그것을위한 가장 좋은 방법은 아마도 ModelAdminformfield_overrides 속성 될 것입니다 :

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

재정 JS :이 위젯 자식 모델 형태로 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

나는이 방법을 사용하여 시도하고 여러 날짜의 양식에 존재하는 경우 위의 자바 스크립트가 작동하지 않았다 발견했다.

여기가 내가 한 것입니다. 내 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

정말입니까? 'choices'가'TimeField'에 대한 잘못된 옵션임을 알리는 오류가 발생했습니다 – raratiru

+0

2015 년에 나를 위해 일해 왔습니다. 현재 버전이 허용하지 않을 수도 있습니다. 이 스 니펫을 사용하는 프로젝트는 여전히 실행되고 있습니다. – Bit68

+1

내가 잘못 철자 한 경우를 대비하여 다시 확인해야합니다. 귀하의 아이디어는 훌륭합니다. – raratiru

관련 문제