Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在POST中区分不同的AJAX函数?_Javascript_Jquery_Django_Ajax - Fatal编程技术网

Javascript 如何在POST中区分不同的AJAX函数?

Javascript 如何在POST中区分不同的AJAX函数?,javascript,jquery,django,ajax,Javascript,Jquery,Django,Ajax,我需要在django视图的POST方法中区分多个AJAX函数,以处理多个表单 背景: <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<

我需要在django视图的POST方法中区分多个AJAX函数,以处理多个表单

背景:

<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>
我以前在没有AJAX的情况下编写了这个视图,并且工作得很好。在Ajax之前,我可以通过添加name=“some\u button\u name”来区分每个表单的POST方法,如下所示:

if request.method == 'POST' and 'some_button_name' in request.POST: #check which form button submitted
这很好,但是如果我让它工作起来,AJAX可以让它变得更好。现在我不知道如何区分视图端的ajax函数

以下是我认为它应该如何工作(理论观点):

。。。但是我被难住了。下面是我的(简化但结构准确)代码。它当然希望调用每个模型的save方法,而不管调用了哪个表单/ajax函数,因此保存表单C将破坏表单B,因为B的ajax处理程序没有执行任何操作或传递任何JSON

我已经浏览了ajax参数列表,但似乎无法使用它添加一些识别变量,以便在POST中的视图端捕获。。。还是有

如果有人能为解决这个问题提供一些线索,我将不胜感激。另外,我不确定它是否与这个问题相关,但我还想最终添加一个“saveall”按钮,该按钮触发所有ajax函数

视图.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
            })
        })

$(() => {
//组成一个处理程序
$(函数(){
$('#mybtn-a')。单击(函数(){
var formA=$(“.form-a-ajax”)
var formAMethod=形式属性(“方法”);
var formAEndpoint=形式属性(“行动”);
形式提交(功能(事件){
event.preventDefault();
var formAData=formA.serialize()
var thisForm=$(此)
$.ajax({
方法:表格法,
url:formAEndpoint,
数据:形式数据,
成功:功能(数据){
美元兑换({
标题:“成功!”,
})
},
错误:函数(错误){
}
})//结束ajax
});//结束单击
})
})
//表格B处理程序
$(函数(){
$('#mybtn-b')。单击(函数(){
var formB=$(“.form-b-ajax”)
var formBMethod=formB.attr(“方法”);
var formBEndpoint=formB.attr(“操作”)
表格B.提交(功能(事件){
event.preventDefault();
var formBData=formB.serialize()
var thisForm=$(此)
$.ajax({
方法:formb法,
网址:formBEndpoint,
数据:formBData,
成功:功能(数据){
美元兑换({
标题:“成功!”,
})
},
错误:函数(错误){
}
})//结束ajax
});//结束单击
})
})
//表格C处理程序
$(函数(){
$('#mybtn-c')。单击(函数(){
var formC=$(“.form-c-ajax”)
var formCMethod=formC.attr(“方法”);
var formCEndpoint=formC.attr(“操作”)
表单提交(功能(事件){
event.preventDefault();
var formCData=formC.serialize()
var thisForm=$(此)
$.ajax({
方法:formCMethod,
网址:formCEndpoint,
数据:formCData,
成功:功能(数据){
美元兑换({
标题:“成功!”,
})
},
错误:函数(错误){
}
})//结束ajax
});//结束单击
})
})
模板:

<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>

{%csrf_token%}{{form_A}}
拯救
{%csrf_token%}{{form_B}}
拯救
{%csrf_token%}{{form_C}}
拯救

谢谢大家的反馈!你们的评论给了我一个想法。我有一个可行的解决方案,事后看起来非常简单。在我的例子中,不需要在JSON中附加任何内容。我拥有的每个模型都有一些唯一的字段名;我只需要检查其中一个是否存在于键:值对的JSON对象中。这rks:

    if request.method == 'POST' and 'some_unique_model_field_name' in request.POST.keys():

        form_A = Model_A_Form(request.POST, instance=mymodel.model_a)
        if form_A.is_valid():
            form_A.save()
            return JsonResponse

        #rinse and repeat...


有几种方法可以做到这一点。您可以在每个表单中放置一个隐藏输入,并使用一个唯一的值来标识表单,也可以在序列化表单后在表单数据的末尾附加一个值,如
formCData+='&formName=c'
。是的,每个表单的隐藏输入都具有相同的名称和唯一的值!您还可以添加o ajax参数,例如:target:FormA,然后根据目标值进行切换……您可以将按钮type='submit'转换为输入type='submit',输入相同的名称和不同的值,然后根据值在django中检查值。您只需选择表单谢谢大家的评论。我将尝试其中的一些解决方案。@Bilel,可以吗关于添加ajax参数,您有更多的详细信息吗?例如,在您的示例中,formAData具有序列化内容[data:formAData+“&target=FormA”],然后对目标值进行切换或条件检查即可;)这假设您的ajax类型为“POST”。这里还可以使用jQuery参数