Django管理员-自动完成选择不会发出“更改”事件

时间:2019-12-30 20:32:47

标签: javascript django autocomplete jquery-select2 admin

我有一个模型Color,其中有一个我想自动完成的外键mill。此外,我想检测mill选择框何时发生更改,并使用Javascript进行处理。但是,我似乎无法在更改选择框后触发任何JS。

我这样设置管理员:

# admin.py

class MillAdmin(admin.ModelAdmin):
    search_fields = ['name']

class ColorAdmin(admin.ModelAdmin):
    class Media:
        js = ['js/jquery/jquery.min.js', 'js/admin/some-function.js',]

    autocomplete_fields = ['mill']

我写了一些Javascript:

// some-function.js

console.log('loaded script');
document.addEventListener('change', (function(e) {
    console.log('detected change event somewhere')
}))
console.log('event listener added')

在浏览器控制台中,当我访问“颜色”页面时,我看到:

loaded script
event listener added

但是当我选择工厂时,什么也没有记录。

更多笔记
自动完成功能本身可以正常工作-我可以选择所需的工厂,进行保存等。此外,如果我从管理员中删除了autocomplete_fields = ['mill'],我会看到香草选择框确实触发了{{1 }}事件如预期:

change

我在源代码中进行了足够长时间的挖掘,以发现Django使用的是Select2,它承诺会发出change事件,就像它是普通的选择框一样。但是,如果发生这种情况,则页面中的其他内容一定在吞噬它,因为我没有看到它。这是怎么回事?如果Django和Select2之间存在冲突,有人知道解决方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

本机事件侦听器无法观察到由jQuery触发的事件。 Select2使用jQuery的触发函数来处理事件,该事件不会触发本机DOM事件,但您可以将jQuery触发器交换为本机DOM,如此处https://github.com/select2/select2/issues/4686