Сохранение модели 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")) что позволяет вам узнать, как просмотреть все данные формы, которые передаются обратно.