Spec-Zone.ru › Django 5.2

Настройка JavaScript в админ-панели

События для инлайновых форм

Возможно, вам потребуется выполнить JavaScript-код при добавлении или удалении инлайновой формы в форме изменения админ-панели. Для этого используются события formset:added и formset: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
});

Два момента для учета:

  • Код JavaScript должен находиться в блоке шаблона, если вы наследуете admin/change_form.html, иначе он не будет отображаться в окончательном HTML.
  • {{ block.super }} добавлен, так как блок admin_change_form_document_ready Django содержит JavaScript-код для обработки различных операций в форме изменения, и нам нужно, чтобы он также отображался.

Поддержка версий Django, более ранних, чем 4.1

Если вашему обработчику событий всё ещё нужно поддерживать более старые версии 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)
    }
})

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/ref/contrib/admin/javascript/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API