首页 > 解决方案 > 当 Django Admin Popup(添加、更新、删除)完成时,有没有办法调用 Javascript 函数?

问题描述

图片

我有这种情况,我在 Person 字段上绑定了 change 事件。

每次选择值更改时,我们都依赖一些 JavaScript 来运行。它当前正在侦听所述元素的更改事件,当用户直接在选择建议的菜单中单击一个值时,该事件可以正常工作。

遗憾的是,当通过 Admin Popup 功能填充此选择时,似乎没有为选择触发更改事件,因为我们的回调没有执行,即使元素的值实际上已更改。

与用户直接从列表中单击一个值时相比,我们可以监听另一个事件以获得相同的行为吗?

标签: javascriptdjangodjango-admin

解决方案


正如您在django 源代码中看到的那样,change更新相关对象时不会触发事件。当它在删除添加时触发。

我最初认为这是一个错误,但实际上它是有道理的,因为该值不一定/实际上已更新。

但是,如果您需要在用例中触发此类事件,这确实是一个问题。我可以建议的最好方法是在您自己的 JS 中覆盖此行为(当然,请确保在加载 Django 的 JS 后调用它):

window.djangoDismissChangeRelatedObjectPopup = window.dismissChangeRelatedObjectPopup;

window.dismissChangeRelatedObjectPopup = function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
    const id = win.name.replace(/^edit_/, '');
    const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
    const selects = $(selectsSelector);
    window.djangoDismissChangeRelatedObjectPopup(win, objId, newRepr, newId);
    selects.trigger('change');
}

因此,change每当更新相关对象时都应该触发该事件。


推荐阅读