2016-05-09 21 views
1

Grappelli默認datepicker週日作爲一週的第一天。這真的很刺激!我希望星期一成爲我所有現在和未來模型的第一天。Grappelli中的datepicker中的周開始管理界面

有沒有辦法做到這一點?

到目前爲止,我發現唯一的「solution」涉及改變模型的媒體類。然而,這種解決方案似乎不工作,因爲與以下:

class Monkey(ImportExportActionModelAdmin): 

    class Media: 
     js = ("static/i18n/ui.datepicker-en-GB.js") 

    ... 

哪裏static/i18n/ui.datepicker-en-GB.js

(function($) { 
    // datepicker, timepicker init 
    grappelli.initDateAndTimePicker = function() { 

     var options = { 
      closeText: "Done", 
      prevText: "Prev", 
      nextText: "Next", 
      currentText: "Today", 
      monthNames: [ "January","February","March","April","May","June", 
      "July","August","September","October","November","December" ], 
      monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], 
      dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], 
      dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], 
      dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], 
      weekHeader: "Wk", 
      dateFormat: "dd/mm/yy", 
      firstDay: 1, 
      isRTL: false, 
      showMonthAfterYear: false, 
      yearSuffix: "" 
     }; 

})(grp.jQuery); 

在任何情況下,這種解決方案是次優的使用會日期的任何新模式必須定義相同的Meta類。

回答

0

上面的代碼確實存在一些錯誤。

首先,AdminModel應該是

class Monkey(ImportExportActionModelAdmin): 

    class Media: 
     js = ("i18n/ui.datepicker-en-GB.js",) 

    ... 

作爲靜態目錄自動追加和js變量必須是一個元組 - 注意逗號。

其次,我使用的javascrpt是static/grappelli/js/grappelli.js的複製和粘貼,其中firstDay: 1,選項被添加到options變量中。它讀起來像這樣:

(function($) { 
    grappelli.initDateAndTimePicker = function() { 

     // HACK: get rid of text after DateField (hardcoded in django.admin) 
     $('p.datetime').each(function() { 
      var text = $(this).html(); 
      text = text.replace(/^\w*: /, ""); 
      text = text.replace(/<br>[^<]*: /g, "<br>"); 
      $(this).html(text); 
     }); 

     var options = { 
      firstDay: 1, // THIS IS THE ONLY CHANGE!!! 
      constrainInput: false, 
      showOn: 'button', 
      buttonImageOnly: false, 
      buttonText: '', 
      dateFormat: grappelli.getFormat('date'), 
      showButtonPanel: true, 
      showAnim: '', 
      // HACK: sets the current instance to a global var. 
      // needed to actually select today if the today-button is clicked. 
      // see onClick handler for ".ui-datepicker-current" 
      beforeShow: function(year, month, inst) { 
       grappelli.datepicker_instance = this; 
      } 
     }; 
     var dateFields = $("input[class*='vDateField']:not([id*='__prefix__'])"); 
     dateFields.datepicker(options); 

     if (typeof IS_POPUP != "undefined" && IS_POPUP) { 
      dateFields.datepicker('disable'); 
     } 

     // HACK: adds an event listener to the today button of datepicker 
     // if clicked today gets selected and datepicker hides. 
     // use on() because couldn't find hook after datepicker generates it's complete dom. 
     $(document).on('click', '.ui-datepicker-current', function() { 
      $.datepicker._selectDate(grappelli.datepicker_instance); 
      grappelli.datepicker_instance = null; 
     }); 

     // init timepicker 
     $("input[class*='vTimeField']:not([id*='__prefix__'])").grp_timepicker(); 

    }; 
})(grp.jQuery); 

第三,我修改了所有需要日期選擇器的AdminModels。這是一個PITA,我希望有一個更好的方法。有可能是......

1

解決方案的第一部分是另一個JavaScript文件添加到管理圖,如由@Sardathrion已經描述:

class MyModelAdmin(ModelAdmin): 
    class Media: 
     js = ('js/grappellihacks.js',) 

第二部分是重新配置呈現日期選擇器小部件。因爲他們得到一個共同的類屬性,您grappellihacks.js的這裏面的代碼應該足夠:

grp.jQuery(function() { 
    grp.jQuery('.hasDatepicker').datepicker('option', 'firstDay', 1); 
}); 

該選項在jQuery UI documentation描述。 grp屬性由grappelli.js設置,該屬性由管理模板在您的自定義媒體文件之前加載。