Spec-Zone.ru › Django 6.0

Настройка 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/6.0/ref/contrib/admin/javascript/

Spec-Zone.ru

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