Filter_horizontal Django - прекратить ввод прессов, отправляющих форму - PullRequest
1 голос
/ 15 января 2011

Я не уверен, что я делаю что-то не так, если что-то сломано по поводу filter_horizontal, или мои ожидания в отношении того, как он должен себя вести, неверны.Любое понимание приветствуется!

На мой взгляд, когда вы используете filter_horizontal, введите несколько символов в текстовое поле, чтобы сузить свой выбор, так что есть один элемент, и нажмите ввод, он должен:

  1. Добавить элемент в выбранный список
  2. очистить введенный текст (позволяя добавить другой).

Что он на самом деле делает:

  1. Добавьте ваш элемент в выбранный список
  2. Сохранить текст в поле фильтра
  3. Отправьте форму, не сохраняя ваш новый выбор

Я делаю что-то неправильно?Это поведение, которое все видят?Есть ли способ обойти это?

Я использую Django 1.2.3, и я тестировал это в Chrome 8.0.552.237, Firefox 3.6.13 и IE 8.

1 Ответ

1 голос
/ 15 января 2011

Я могу подтвердить поведение на Django 1.2.1.

Проблема:

Похоже, admin/js/SelectFilter2.js регистрирует обработчик повышения ключа для выполнения фильтрации.Этот обработчик также возвращает false, если ключом был ключ ввода, который пытается отменить отправку формы.

Из строки admin / js / SelectFilter2.js 85 или около того:

    // don't submit form if user pressed Enter
    if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
        from.selectedIndex = 0;
        SelectBox.move(field_id + '_from', field_id + '_to');
        from.selectedIndex = 0;
        return false;
    } 

Мне показалось, что это нормально, поэтому я добавил обработчик событий в конце метода init вперехватить событие отправки формы:

    addEvent(document.forms[0], 'submit', function(event) {
        console.log("Form submitted"); 
    }

После этого становится ясно, что отправка запускает до события keyUp.Таким образом, нажатие клавиши ввода отправляет форму, и событие keyUp никогда не попадает в поле.

Обходной путь:

Я смог обойти поведение, отбросив все вводимые keyUp в самой форме.Добавьте это в конец метода init в SelectFilter2.js:

    addEvent(document.forms[0], 'keyup', function(event) {
        if (event.keyCode && event.keyCode == 13) {
            return false;
        }
    });

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

Вероятно, это должно быть зарегистрировано как ошибка django .

...