我有一个模型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之间存在冲突,有人知道解决方法吗?谢谢!
答案 0 :(得分:1)
本机事件侦听器无法观察到由jQuery触发的事件。 Select2使用jQuery的触发函数来处理事件,该事件不会触发本机DOM事件,但您可以将jQuery触发器交换为本机DOM,如此处https://github.com/select2/select2/issues/4686