4

讓我們想象一下,我們有那些Django模型:當Django Admin Popup(綠色加號圖標)完成時,是否有事件或其他方式調用Javascript函數?

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值。


我們依靠一些javascript來運行每次select值的變化。它當前正在聆聽所述元素的change事件,當用戶直接點擊select提出的菜單中的值時,該事件正常工作。

可悲的是,當這select通過管理彈出功能稀少,似乎change事件不會觸發針對select,如不執行我們的回調,即使元素的值實際上改變。

是否有另一個事件,我們可以聽到以獲得相同的行爲,當用戶直接從列表中單擊值時?

回答

5

這是一個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); 
+0

這是我貼到Django的用戶郵件列表同樣的答覆,但堆棧溢出是使用或討論此代碼段一個更好的地方。以下是討論主題:https://groups.google.com/d/msg/django-users/7sIM2-9XirY/d6Yr5_fFBwAJ –

+0

非常感謝您,這允許您實現該功能。我們使用的是** Django 1.8 **,它只需要兩個小小的改動:'dismissAddAnotherPopup'應該重命名爲'dismissAddRelatedObjectPopup',它應該(並且轉發)一個額外的參數('newRepr')。 –

+0

打開[與Django管理彈出窗口相關的另一個問題](http://stackoverflow.com/q/33941944/1027706),以防萬一你有線索? –

相關問題