在管理介面中使用 JavaScript 客製化

內聯表單事件

您可能希望在管理變更表單中新增或移除內聯表單時執行一些 JavaScript。 formset:addedformset:removed 事件允許這樣做。 event.detail.formsetName 是該行所屬的表單集。對於 formset:added 事件, event.target 是新加入的行。

在您的自訂 change_form.html 模板中,擴展 admin_change_form_document_ready 區塊並新增事件監聽器程式碼

{% extends 'admin/change_form.html' %}
{% load static %}

{% block admin_change_form_document_ready %}
{{ block.super }}
<script src="{% static 'app/formset_handlers.js' %}"></script>
{% endblock %}
app/static/app/formset_handlers.js
document.addEventListener('formset:added', (event) => {
    if (event.detail.formsetName == 'author_set') {
        // Do something
    }
});
document.addEventListener('formset:removed', (event) => {
    // Row removed
});

請記住兩點

  • 如果您繼承 admin/change_form.html,JavaScript 程式碼必須放在模板區塊中,否則它不會在最終的 HTML 中呈現。

  • 加入 {{ block.super }} 是因為 Django 的 admin_change_form_document_ready 區塊包含處理變更表單中各種操作的 JavaScript 程式碼,我們也需要呈現它。

支援早於 4.1 的 Django 版本

如果您的事件監聽器仍然必須支援舊版本的 Django,您必須使用 jQuery 來註冊您的事件監聽器。jQuery 處理 JavaScript 事件,但反之則不然。

您可以檢查是否有 event.detail.formsetName,並回退到舊的監聽器簽名,如下所示

function handleFormsetAdded(row, formsetName) {
    // Do something
}

$(document).on('formset:added', (event, $row, formsetName) => {
    if (event.detail && event.detail.formsetName) {
        // Django >= 4.1
        handleFormsetAdded(event.target, event.detail.formsetName)
    } else {
        // Django < 4.1, use $row and formsetName
        handleFormsetAdded($row.get(0), formsetName)
    }
})
回到頂部