假设我们有这些 Django 模型:
class Band(models.Model):
name = models.CharField(max_length=256, default="Eagles of Death Metal")
class Song(models.Model):
band = models.ForeignKey(Band)
当使用管理员来管理这些模型时,band
字段关联到Widget
Django 渲染为select
html 元素。
Django 的管理员还添加了一个绿色加号图标旁边的select
,单击它会打开一个弹出窗口,向用户显示Form
添加新乐队。当点击save按钮,新的乐队名称将保存在 DB 中,并自动分配给select
value.
我们依赖于每次运行一些 JavaScriptselect
值变化。目前正在收听change
所述元素的事件,当用户直接单击该元素建议的菜单中的值时,该事件可以正常工作select
.
可悲的是,当这select
通过管理弹出功能填充,看起来change
事件不会被触发select
,因为即使元素的值实际上发生了更改,我们的回调也不会执行。
我们是否可以监听另一个事件来获得与用户直接从列表中单击值时相同的行为?
这是一个 Javascript 片段,其中包含我们用来在 Django 管理员的添加/更改弹出窗口关闭时触发更改事件的黑客技术。
我们在 Django 1.7 中使用它,所以它至少适用于这个版本。
对 Django 管理的 JS 方法进行猴子修补来实现这一点并不是一个非常优雅的方法,但它是我们发现的侵入性最小的选项。如果有人知道更好的方法,请告诉我们。
/*
* Trigger change events when Django admin's popup window is dismissed
*/
(function($) {
$(document).ready(function() {
// HACK to override `dismissRelatedLookupPopup()` and
// `dismissAddAnotherPopup()` in Django's RelatedObjectLookups.js to
// trigger change event when an ID is selected or added via popup.
function triggerChangeOnField(win, chosenId) {
var name = windowname_to_id(win.name);
var elem = document.getElementById(name);
$(elem).change();
}
window.ORIGINAL_dismissRelatedLookupPopup = window.dismissRelatedLookupPopup
window.dismissRelatedLookupPopup = function(win, chosenId) {
ORIGINAL_dismissRelatedLookupPopup(win, chosenId);
triggerChangeOnField(win, chosenId);
}
window.ORIGINAL_dismissAddAnotherPopup = window.dismissAddAnotherPopup
window.dismissAddAnotherPopup = function(win, chosenId) {
ORIGINAL_dismissAddAnotherPopup(win, chosenId);
triggerChangeOnField(win, chosenId);
}
});
})(jQuery);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)