Мне нужно различать guish среди нескольких AJAX функций в методе POST django view для обработки нескольких форм.
Фон:
Ранее я писал это представление без AJAX, и все получалось нормально. До Ajax я мог различать guish метод POST для каждой формы, добавляя name = "some_button_name", например так:
if request.method == 'POST' and 'some_button_name' in request.POST: #check which form button submitted
Это было здорово, но AJAX может сделать это лучше, если я получу это работает. Теперь я не уверен, как отличить guish от функций ajax на стороне обзора.
Вот как я думаю должно работать (теоретический взгляд):
if request.method == 'POST' and request.POST['some identifier_A from ajax function here']:
# do stuff
# save form_A
if request.method == 'POST' and request.POST['some identifier_B from ajax function here']:
# do stuff
# save form_B
if request.method == 'POST' and request.POST['some identifier_C from ajax function here']:
# do stuff
# save form_C
... но я в тупике. Ниже мой (упрощенный, но структурно точный) код. Конечно, он захочет вызвать метод сохранения каждой модели независимо от того, какая функция формы / ajax была вызвана, поэтому при сохранении форма C будет испорчена форма B , поскольку B * Обработчик 1055 * ничего не делал и не передавал JSON.
Я просмотрел список ajax параметров, и не похоже, что я могу использовать его, чтобы добавить некоторую идентифицирующую переменную для захвата на стороне вида в POST ... или есть?
Если бы кто-то мог пролить свет на способ решить эту проблему, я был бы очень благодарен. Кроме того, я не уверен, имеет ли это отношение к этому вопросу, но я также хочу со временем добавить кнопку «сохранить все», которая запускает все функции ajax.
Views.py
def update_view(request, slug):
mymodel = Model.objects.get(slug=slug)
form_A = Model_A_Form(instance=mymodel.model_a)
form_B = Model_B_Form(instance=mymodel.model_b)
form_C = Model_C_Form(instance=mymodel.model_c)
if request.method == 'POST': # using request.is_ajax(): here causes the same problem
form_A = Model_A_Form(request.POST, instance=mymodel.model_a)
if form_A.is_valid():
form_A.save()
return JsonResponse
form_B = Model_B_Form(request.POST, instance=mymodel.model_b)
if form_B.is_valid():
form_B.save()
return JsonResponse
form_C = Model_C_Form(request.POST, instance=mymodel.model_c)
if form_C.is_valid():
form_C.save()
return JsonResponse
context = {
'form_A': form_A,
'form_B': form_B,
'form_C': form_C,
'obj': mymodel,
}
return render(request, "products/update_form.html", context)
. JS
<script>
$(() => {
// Form A handler
$(function () {
$('#mybtn-a').click(function () {
var formA = $(".form-a-ajax")
var formAMethod = formA.attr("method");
var formAEndpoint = formA.attr("action");
formA.submit(function (event) {
event.preventDefault();
var formAData = formA.serialize()
var thisForm = $(this)
$.ajax({
method: formAMethod,
url: formAEndpoint,
data: formAData,
success: function (data) {
$.alter({
title: "Success!",
})
},
error: function (error) {
}
}) //end ajax
});//end click
})
})
// Form B handler
$(function () {
$('#mybtn-b').click(function () {
var formB = $(".form-b-ajax")
var formBMethod = formB.attr("method");
var formBEndpoint = formB.attr("action")
formB.submit(function (event) {
event.preventDefault();
var formBData = formB.serialize()
var thisForm = $(this)
$.ajax({
method: formBMethod,
url: formBEndpoint,
data: formBData,
success: function (data) {
$.alter({
title: "Success!",
})
},
error: function (error) {
}
}) // end ajax
});//end click
})
})
// Form C handler
$(function () {
$('#mybtn-c').click(function () {
var formC = $(".form-c-ajax")
var formCMethod = formC.attr("method");
var formCEndpoint = formC.attr("action")
formC.submit(function (event) {
event.preventDefault();
var formCData = formC.serialize()
var thisForm = $(this)
$.ajax({
method: formCMethod,
url: formCEndpoint,
data: formCData,
success: function (data) {
$.alter({
title: "Success!",
})
},
error: function (error) {
}
}) //end ajax
});//end click
})
})
Шаблон:
<form method="post" action="{{ obj.get_my_url }}" class="form-a-ajax">
{% csrf_token %} {{ form_A }}
<button type='submit' id="mybtn-a" name='save_form_a' class='btn btn-success'>Save</button>
</form>
<form method="post" action="{{ obj.get_my_url }}" class="form-b-ajax">
{% csrf_token %} {{ form_B }}
<button type='submit' id="mybtn-b" name='save_form_b' class='btn btn-success'>Save</button>
</form>
<form method="post" action="{{ obj.get_my_url }}" class="form-c-ajax">
{% csrf_token %} {{ form_C }}
<button type='submit' id="mybtn-c" name='save_form_c' class='btn btn-success'>Save</button>
</form>