Django 管理员 - 自动完成 select 不发出 "change" 事件

Django admin - autocomplete select doesn't emit "change" event

我有一个模型 Color,它有一个我想自动完成的外键 mill。此外,我想检测 mill select 框何时更改并在 Javascript 中对其进行处理。但是,我似乎无法触发正在更改的 select 框中的任何 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')

在我的浏览器控制台中,当我访问 Color 页面时,我看到:

loaded script
event listener added

但是当我 select 一个磨机时,没有更多的记录。

补充说明:
自动完成本身工作得很好——我可以选择我想要的工厂,保存等等。此外,如果我从我的管理员中删除 autocomplete_fields = ['mill'],我看到 vanilla select 框确实触发change 事件符合预期:

loaded script
event listener added
detected change event somewhere

我仔细研究了源代码,发现 Django 使用的是 Select2,它承诺会像普通 select 框一样发出更改事件。但如果发生这种情况,则页面中的其他东西一定正在吞噬它,因为我没有看到它。这是怎么回事?如果 Django 和 Select2 之间存在冲突,有人知道解决方法吗?谢谢!

由 jQuery 触发的事件无法被本机事件侦听器观察到。 Select2 使用 jQuery 的触发器函数来处理事件,它不会触发本机 DOM 事件,但您可以将 jQuery 触发器换成本机 DOM 触发器,如图所示这里 https://github.com/select2/select2/issues/4686