Personnalisations de JavaScript dans l’interface d’administration

Événements de sous-formulaires

Il peut être souhaitable d’exécuter du code JavaScript lorsqu’un sous-formulaire est ajouté ou enlevé dans un formulaire de modification du site d’administration. Les évènements formset:added et formset:removed permettent de faire cela. event.detail.formsetName correspond au jeu de formulaires auquel appartient la ligne. Pour l’évènement formset:added, event.target correspond à la nouvelle ligne qui a été ajoutée.

Changed in Django 4.1:

Dans les versions précédentes, l’évènement était un évènement jQuery avec les paramètres $row et formsetName. Il s’agit dorénavant d’un évènement JavaScript CustomEvent avec les paramètres définis dans event.detail.

Dans votre gabarit change_form.html personnalisé, étendez le bloc admin_change_form_document_ready et ajoutez la fonction d’écoute avec ce code :

{% 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
});

Deux points à garder en tête :

  • Le code JavaScript doit se trouver dans un bloc de gabarit si vous héritez de admin/change_form.html, sinon il ne sera pas produit dans le code HTML final.
  • {{ block.super }} est ajouté car le bloc admin_change_form_document_ready contient du code JavaScript pour gérer diverses opérations dans le formulaire de modification et que nous avons besoin que ce contenu apparaisse aussi.

Prise en charge des versions Django plus anciennes que 4.1

Si votre écouteur d’évènements doit encore prendre en charge des anciennes versions de Django, vous devez utiliser jQuery pour inscrire votre écouteur d’évènements. jQuery gère les évènements JavaScript, mais l’inverse n’est pas vrai.

Vous pouvez vérifier la présence de event.detail.formsetName et vous rabattre alors sur l’ancienne signature de l’écouteur, comme ceci :

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)
    }
})
Back to Top