2016-05-09 8 views
1

Grappelli по умолчанию datepicker поставляется с воскресеньем в качестве первого дня недели. Это действительно раздражает! Я хочу, чтобы понедельник стал первым днем ​​недели для всех моих нынешних и будущих моделей.Начало недели в datepicker в интерфейсе администратора Grappelli

Есть ли способ сделать это?

До сих пор единственный «solution», который я нашел, включал в себя изменение класса Media. Однако это решение не похоже на работу как со следующим:

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

В любом случае, это решение неоптимальным, как и любой новой модели, используя бы дату должны иметь один и тот же мета-класс.

ответ

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, что нуждался в DatePicker. Это PITA, и я хочу, чтобы был лучший способ сделать это. Там может быть ...

1

Первая часть раствора добавить еще один файл JavaScript в представлении администратора, как уже описано @Sardathrion:

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

Вторая часть является перенастраивать отображаемые виджеты datepicker. Так как они получают общий атрибут класса, этот код внутри вашего grappellihacks.js должно быть достаточно:

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

Опция описана в jQuery UI documentation. Атрибут grp устанавливается grappelli.js, который загружается шаблоном администратора перед вашим пользовательским медиа-файлом.