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
我有一个模型 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