Django的filter_horizo​​ntal - 停止输入提交表单的印刷机

时间:2011-01-15 17:21:20

标签: django django-admin

我不确定我做错了什么,如果filter_horizontal出现问题,或者我对它应该表现的方式的期望是错误的。任何见解都赞赏!

在我看来,当你使用filter_horizontal时,在文本框中键入几个字符以缩小你的选择范围以便有一个项目,然后点击输入,它应该:

  1. 将项目添加到选定列表
  2. 清除您输入的文字(允许您添加其他文字)。
  3. 它实际上做的是:

    1. 将您的商品添加到所选列表
    2. 将文字保留在过滤框中
    3. 提交表单,而不保存新选择
    4. 我做错了吗?这是每个人都看到的行为吗?有办法解决这个问题吗?

      我正在使用Django 1.2.3,我在Chrome 8.0.552.237,Firefox 3.6.13和IE 8中测试过它。

1 个答案:

答案 0 :(得分:1)

我可以确认Django 1.2.1上的行为。

<强>问题:

看起来admin/js/SelectFilter2.js注册了一个密钥处理程序来进行过滤。如果键是enter键,则此处理程序也返回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事件。因此,按Enter键提交表单,keyUp事件永远不会到达字段。

解决方法:

我能够通过放弃表单上的所有输入keyUp来解决这个问题。将其添加到SelectFilter2.js中的init方法的末尾:

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

这是解决问题的快速而肮脏的方法,但是在事件的事件之后触发了表单事件,所以它似乎有效。但它也阻止了回车键在其他地方提交表单。

这应该归档为django bug