jquery,ajax:几个post-requests而不是一个

时间:2013-05-21 07:51:25

标签: jquery ajax django-templates

我正在使用django和jQuery,我尝试在提交后更改按钮视图而不重新加载页面。当我第一次按下它时一切正常,但第二次按下导致两个POST请求,第三个到三个等等,按钮不再改变。虽然按下每个按钮,数据库中的数据会发生变化。

请帮助我找出我的jquery代码有什么问题以及如何防止post请求乘法

 function send()
{
    $('.valid').submit(function() 
        {
            var a_id = $(this).attr('a_id');
            var vl = $(this).attr('vl');
            $.ajax(
            { 
                        data: {'a_id' : a_id},
                        type: 'POST', 
                        url: 'vl/', 
                        success: function(data, status) 
                        { 
                            $('#mark_'+a_id).html('<i class="icon-white icon-ok"></i> Correct!')
                            $('#mark_'+a_id).attr("id",'cor_'+a_id);        

                            $('#cor_'+a_id).html('Not correct')
                            $('#cor_'+a_id).attr("id",'mark_'+a_id);

                        },
                        error: function(xhr, data) 
                        {
                            alert('fail: ' + data +' answer #'+ a_id);
                        }           
            });

        });

}

a_id用于答案ID,它来自模板中的按钮

{% if answer.validity %}

<button id="cor_{{ answer.id }}" class="btn btn-inverse js-mark " a_id="{{answer.id}}"  onclick = "send()" ><i class="icon-white icon-ok"></i> Correct answer</button>

{% else %} 

<button id="mark_{{ answer.id }}" class="btn btn-inverse js-mark" a_id="{{answer.id}}" onclick = "send()" >Mark this answer as correct</button>

{% endif %}

views.py部分:

def question_vl(request, question_id):
    context_instance=RequestContext(request)
    question = get_object_or_404(Question, pk=question_id)

    if request.user == question.author:
        if request.method == 'POST':
            if(request.POST.get('a_id')): 
                        a = Answer.objects.get(pk=request.POST.get('a_id'))
                        if a.validity==False:
                    a.validity = True
                else:
                    a.validity = False
                a.save()
        return HttpResponse("")

1 个答案:

答案 0 :(得分:1)

这一行

$('.valid').submit(function()

将提交事件附加到表单。因此,无论何时按下按钮功能,“发送”都会再次附加相同的事件。

修改按钮:

{% if answer.validity %}

<button class="btn btn-inverse js-mark" a_id="{{answer.id}}" onclick = "send(this)" ><i class="icon-white icon-ok"></i> Correct answer</button>

{% else %} 

<button class="btn btn-inverse js-mark" a_id="{{answer.id}}" onclick = "send(this)" >Mark this answer as correct</button>

{% endif %}

以这种方式修改你的功能:

function send(button)
{
        button = $(button);
        var a_id = button.attr('a_id');
        $.ajax(
        { 
                    data: {'a_id' : a_id},
                    type: 'POST', 
                    url: 'vl/', 
                    success: function(data, status) 
                    { 
                        if (data.validity){
                           button.html('<i class="icon-white icon-ok"></i> Correct!')
                        } else {
                           button.html('Not correct!')
                        }     
                    },
                    error: function(xhr, data) 
                    {
                        alert('fail: ' + data +' answer #'+ a_id);
                    }           
        });

}

您的服务器端脚本应返回实际值为“validity”的JSON数据