Django request.is_ajax()返回false

时间:2014-06-23 20:03:43

标签: python ajax django

这个问题并不新鲜,但是我花了很多时间,但是没有修复它。

<form id="test_data_form" action={% url 'insert_test_data' %} method="post">{% csrf_token %}
        <input type="submit" value="Insert test data">
        <div id="message"></div>
    </form>
    <script type="text/javascript">
        var form = $("test_data_form");
        $(document).ready(function() {
                    form.submit(function() {
                                $.ajax({
                                         data: form.serialize(),
                                         url: form.attr('action'),
                                         cache: false,
                                         type: form.attr('method'),
                                         dataType:'json',
                                         success: function(response) {
                                             alert("1");
                                         },
                                         error: function() {
                                             alert('Error!');
                                         }
                                        }
                                );
                                return false;
                            }
                    );
                }
        );
    </script>

views.py

@csrf_exempt
def insert_test_data(request):
    print request.is_ajax()
    data = {'success': True, 'html': "text"}
    return HttpResponse(json.dumps(data), mimetype="application/json")

urls.py

url(r'^hello/insert_test_data/$', insert_test_data, name="insert_test_data"),

首先,我发现成功并未被捕获,因此在调试时我发现django并不认为它是ajax请求并将我重定向到不同的页面:/ insert_test_data。我想留在主页上。

我发现了很多关于该问题的建议(例如缓存:false),但没有一个帮助。我同意,我错过了一些显而易见的东西,但无法确切地知道究竟是什么。 我真的很高兴能得到任何帮助。

1 个答案:

答案 0 :(得分:0)

处理表单提交的JavaScript在第一次检查时看起来没问题,但是有一个错误:

var form = $("test_data_form");

如果您使用Firebug或Chrome开发人员工具并在控制台中查询此元素,则您将无法获得任何回复,因为您缺少选择器(标记,ID,类等)。从您的表单标签,我认为您的意思是通过id选择:

var form = $("#test_data_form");