【问题标题】:Is there an event or another way to call a Javascript function when a Django Admin Popup (the green plus icon) completes?当 Django Admin Popup(绿色加号图标)完成时,是否有事件或其他方式调用 Javascript 函数?
【发布时间】:2016-02-20 17:56:41
【问题描述】:

假设我们有这些 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 字段与 Django 呈现为 select html 元素的 Widget 相关联。

Django 的管理员还在select 旁边添加了一个绿色加号图标,单击它会打开一个弹出窗口,其中会向用户显示Form 以添加新乐队。在此弹出窗口中单击保存按钮时,新的乐队名称将保存在数据库中,并自动分配给select值。


每次select 值发生变化时,我们都会运行一些 JavaScript。它当前正在侦听所述元素的change 事件,当用户直接在select 建议的菜单中单击一个值时,它可以正常工作。

遗憾的是,当这个select 通过管理弹出功能填充时,似乎change 事件没有为select 触发,因为我们的回调没有被执行,即使元素的值实际上已经改变了。

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

【问题讨论】:

    标签: javascript django django-admin dom-events


    【解决方案1】:

    这是一个 Javascript sn-p,其中包含我们用来在 Django 管理员的添加/更改弹出窗口被关闭时触发更改事件的黑客。

    我们在 Django 1.7 中使用它,所以它至少适用于这个版本。

    Monkey 修补 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);
    

    【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2013-10-25
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    相关资源
    最近更新 更多