Penyesuaian JavaScript di adminLink to this heading

Peristiwa-peristiwa formulir berderetLink to this heading

You may want to execute some JavaScript when an inline form is added or removed in the admin change form. The formset:added and formset:removed events allow this. event.detail.formsetName is the formset the row belongs to. For the formset:added event, event.target is the newly added row.

Dalam cetakan change_form.html penyesuaian anda, perpanjang blok admin_change_form_document_ready dan tambah kode pendengar kejadian:

Django template
{% 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
JavaScript
document.addEventListener('formset:added', (event) => {
    if (event.detail.formsetName == 'author_set') {
        // Do something
    }
});
document.addEventListener('formset:removed', (event) => {
    // Row removed
});

Dua poin untuk diingat:

  • Kode JavaScript harus berada di blok cetakan jika anda mewarisi admin/change_form.html atau itu tidak akan dibangun dalam HTML akhir.

  • {{ block.super }} ditambahkan karena blok admin_change_form_document_ready Django mengandung kode JavaScript untuk mengangani beragam tindakan dalam formulir rubah dan kami butuh itu dibangun juga.

Supporting versions of Django older than 4.1Link to this heading

If your event listener still has to support older versions of Django you have to use jQuery to register your event listener. jQuery handles JavaScript events but the reverse isn't true.

You could check for the presence of event.detail.formsetName and fall back to the old listener signature as follows:

JavaScript
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)
    }
})