Сохранение модели Django при изменении полей list_editable в представлении change_list в Django Admin

У меня есть Django Model, которую я пытаюсь обновить из представления Admin change_list, когда у поля, перечисленного в list_editable, срабатывает событие изменения. Сейчас единственный способ сохранить обновления - это нажать кнопку "Save", после чего страница перезагружается. Я не хочу, чтобы страница перезагружалась вообще. Я просто хочу, чтобы она обновляла модель асинхронно.

Например, у меня есть следующая модель.

class Example(models.Model):
  name = models.CharField()
  hide = models.BooleanField(default=False)

В форме администратора у меня есть

class ExampleAdmin(admin.ModelAdmin):
    list_display = [
        "name",
        "hide"
    ]

    list_editable = [
        "name",
        "hide"
    ]

При просмотре списка изменений для примера теперь я увижу значения, перечисленные в списке, с редактируемым текстовым вводом для имени и флажком для скрытия.

Я хотел бы прослушивать события на этих входах и при их наступлении отправлять асинхронный запрос для обновления конкретной модели.

В вашей модели администратора добавьте следующее

class ExampleAdmin(admin.ModelAdmin):

    class Media:
       js = ("js/admin/example.js")

    list_display = [
        "name",
        "hide"
    ]

    list_editable = [
        "name",
        "hide"
    ]

example.js

window.addEventListener("load", function() {
    (function($) {
        $(".field-name .vTextField").on("change",function (event) {
            $('#changelist-form').submit()
        })
        $('#changelist-form').submit(function(event) { // On form submit event
            $.ajax({ // create an AJAX call...
                data: $(this).serialize(),
                type: "POST",
                url: 'api/save-example',
                success: function(response) { 
                    console.log(response)
                },
                error: function(e, x, r) {
                    console.log(e)
                }
            });
            event.preventDefault()
            return false;
        });
    })(django.jQuery);
})

Я использую Django Rest Framework, поэтому я создал конечную точку POST, но вы также можете сделать это в Django View, который прослушивает POST.

Когда вы выполните пост, Django отправит данные, классифицированные по номеру строки и имени поля, как показано ниже.

form-0-id : 1
form-0-name: example-name
form-0-hide: false
form-0-example_parent: 100

form-1-id : 2
form-1-name: example-name-two
form-1-hide: true
form-1-example_parent: 200
@api_view(["POST"])
def save_issue(request):

    try:
        total_rows = int(request.POST.get("form-TOTAL_FORMS"))
        prefix = "form-"
        form_fields = {
            "id": "id",
            "name": "name",
            "hide": "hide",
            "example_parent": "example_parent_id",
        }

        for x in range(total_rows):
            item = {}
            for key, val in form_fields.items():
                post_field = prefix + str(x) + "-" + key
                field = val
                if key == "id":
                    id = request.POST.get(post_field)
                else:
                    item[field] = request.POST.get(post_field)

            Example.objects.filter(id=id).update(**item)

        return Response(status=status.HTTP_200_OK)

    except Exception as e:
        return Response(status=status.HTTP_404_NOT_FOUND)

Примечание total_rows = int(request.POST.get("form-TOTAL_FORMS")) что позволяет вам узнать, как просмотреть все данные формы, которые передаются обратно.

Вернуться на верх