Datepicker для веб-страницы, которая может позволить только определенным датам быть нажатыми

Весь импорт в __init__.py сделан доступным при импорте пакета (каталог), который содержит его.

Пример:

./dir/__init__.py:

import something

./test.py:

import dir
# can now use dir.something

РЕДАКТИРОВАНИЕ: забыл упоминать, код в __init__.py выполнения в первый раз, когда Вы импортируете любой модуль из того каталога. Таким образом, это обычно - хорошее место для помещения любого кода инициализации уровня пакета.

EDIT2: dgrant, на который указывают возможному беспорядку в моем примере. В __init__.py import something может импортировать любой модуль, не необходимый от пакета. Например, мы можем заменить его [1 110], затем на нашем верхнем уровне test.py оба из этих отрывков будет работать:

import dir
print dir.datetime.datetime.now()

и

import dir.some_module_in_dir
print dir.datetime.datetime.now()

нижняя строка: все имена присвоились в [1 112], быть, импортированные модули, функции или классы, автоматически доступны в пространстве имен пакета каждый раз, когда Вы импортируете пакет или модуль в пакете.

17
задан Rob Van Dam 28 December 2009 в 18:08
поделиться

7 ответов

Событие Datepicker beforeShowDay() предназначено именно для этой цели. Вот пример, где набор разрешенных дат относительно мал для иллюстрации. В зависимости от того, сколько дат у вас есть и как они выбраны, вы можете вместо этого написать метод, который программно выбирает даты (например, игнорируя выходные, 1-е и 15-е числа каждого месяца и т.д.). Или вы можете комбинировать оба метода, например, удалять выходные и фиксированный список праздников.

$(function() {
    // this could be a static hash, generated by the server, or loaded via ajax
    // if via ajax, make sure to put the remaining code in a callback instead.
    var dates_allowed = {
          '2009-12-01': 1,
          '2009-12-25': 1,
          '2010-09-28': 1,
          '2011-10-13': 1
    };

    $('#datepicker').datepicker({
        // these aren't necessary, but if you happen to know them, why not
        minDate: new Date(2009, 12-1, 1),
        maxDate: new Date(2010, 9-1, 28),

        // called for every date before it is displayed
        beforeShowDay: function(date) {

            // prepend values lower than 10 with 0
            function addZero(no) {
                if (no < 10){
                  return "0" + no;
                }  else {
                  return no; 
                }
            }

            var date_str = [
                addZero(date.getFullYear()),
                addZero(date.getMonth() + 1),
                addZero(date.getDate())      
            ].join('-');

            if (dates_allowed[date_str]) {
                return [true, 'good_date', 'This date is selectable'];
            } else {
                return [false, 'bad_date', 'This date is NOT selectable'];
            }
        }
    });
});

Возвращаемые значения равны

[0]: boolean selectable or not,
[1]: CSS class names to apply if any (make sure to return '' if none),
[2]: Tooltip text (optional)

Обратите внимание, что переменная даты, заданная в обратном вызове, является экземпляром объекта "Дата", представляющего данный день, а не текстовой версией этой даты в указанном формате. Например, вы можете создать список допустимых дат в одном формате при отображении дат в блоке данных в другом формате (например, вам не придется преобразовывать даты из БД при генерации страницы).

См. также Можно ли в jQuery UI Datepicker отключить субботу и воскресенье (и праздничные дни)?

31
ответ дан 30 November 2019 в 11:27
поделиться

Вы можете начать с использования jquery ui datepicker. Загрузите последнюю версию пакета разработки и работайте с ui.datepicker.js. См. _GenerateHTML. Найдите переменную, которую нельзя выбрать. Если ваш серверный код может сгенерировать какой-то скрипт - он может заполнить некоторые новые настройки, вы можете расширить выбор даты, чтобы принять. Затем добавьте проверку к тому списку действительных дат в этой строке, где установлено значение «Невозможно выбрать». Обратите внимание, что, похоже, средство выбора даты позволяет вводить даты с клавиатуры за пределами допустимого диапазона.

Если вы уже используете jquery ui, я бы, вероятно, просто переопределил прототип _generateHTML после того, как вы загрузили сценарий jquery UI.

3
ответ дан 30 November 2019 в 11:27
поделиться

Возможно, вы могли бы расширить DatePicker, чтобы разрешить отключенные / разрешенные даты ... Я считаю, что вы могли бы удалить обработчик кликов для отключенных дат, сделав их неактивными. Затем просто настройте CSS для отключенных дат, и они могут быть "серыми".

0
ответ дан 30 November 2019 в 11:27
поделиться

Я сделал такое приложение (веб-выбор даты с различными запрещенными датами), используя YUI Calendar и кучу настраиваемого кода. При этом я сделал это до того, как открыл для себя чудесные радости jQuery (и «Боже, это не вполовину так хорошо, как jQuery, но, по крайней мере, он использует методы jQuery» пользовательского интерфейса jQuery). Если бы я сделал это снова, я бы определенно использовал jQuery UI (несмотря на его многочисленные недостатки) в качестве основы; смешивать библиотеки сложнее, чем иметь дело с незрелостью пользовательского интерфейса jQuery.

0
ответ дан 30 November 2019 в 11:27
поделиться

Попробуйте dijit.Calendar Существует свойство isDisabledDate, которое вы можете установить в разметке или в JavaScript для функции. См. Второй пример. Метод отключения дат вызывается для каждого дня по мере его отображения. Функция может делать что-то вроде определения того, соблюдается ли шаблон (это выходные?), Или сравнивать его с некоторой статической таблицей (массивом), которую вы предоставляете с сервера, например, в дни занятости или праздники. Метод getClassForDate можно переопределить, чтобы вернуть класс CSS.

2
ответ дан 30 November 2019 в 11:27
поделиться

Разрабатывая ответ Роба Ван Дама, вот пример кода (с использованием набора данных jQuery UI) для получения включенных дат с помощью AJAX. Я использую AJAX для запроса PHP-страницы, которая возвращает включенную дату из базы данных (потому что я хочу показывать только даты, где у меня есть фактические данные).

Идея заключается в том, чтобы делать AJAX-запрос каждый раз, когда пользователь меняет месяц, а затем хранить включенные даты для этого месяца в глобальном массиве (allowedDates), который позже будет использоваться доShowDay.

Конечно, можно было бы выполнять AJAX-запрос в beforeShowDay, но это было бы довольно неэффективно из-за большого количества AJAX-запросов (более 30 за каждый месяц).

var allowedDates = new Object();

function queryAllowedDates (year, month, id) {
  $.ajax({
    type: 'GET',
    url: 'calendar_days.php',
    dataType: 'json',
    success: function(response) { 
      allowedDates[id] = response.allowedDates;
    },
    data: {year:year,month:month},
    async: false
  });
}

$("#datepicker1").datepicker({
  dateFormat: 'dd.mm.yy', 
  changeMonth: true, 
  changeYear: true ,
  beforeShow: function (input) {
    var currentDate = $(input).datepicker('getDate');
    var id = $(input).attr('id');
    queryAllowedDates(currentDate.getFullYear(), currentDate.getMonth()+1,id);
  },
  onChangeMonthYear: function (year, month, inst) {
    queryAllowedDates(year, month, inst.input.attr('id'));
  },
  beforeShowDay: function (day) {
    var id = $(this).attr('id');

    var date_str = [
      day.getFullYear(),
      day.getMonth() + 1,
      day.getDate()
    ].join('-');

    if (allowedDates[id] != undefined && allowedDates[id][date_str]) {
      return [true, 'good_date', 'This date is selectable'];
    } else {
      return [false, 'bad_date', 'This date is NOT selectable'];
    } 
  }
});

В этом примере PHP-страница возвращает JSON-массив, содержащий что-то вроде :

{"allowedDates":{"2008-12-04":1,"2008-12-11":1}}
4
ответ дан 30 November 2019 в 11:27
поделиться

Я использую Класснейший Яваскриптовый Календарь в течение многих лет, и он имеет возможность отключать некоторые дни календаря. Просто посмотрите на него, я использую его во всех типах ASP.NET проектов.

Больше информации о отключении дат можно найти здесь.

.
0
ответ дан 30 November 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: