Django的request.is_ajax()返回false

2 投票
1 回答
2226 浏览
提问于 2025-04-18 10:49

这个问题并不新鲜,不过我花了很多时间,还是没能解决。

<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。我想留在主页上。

我找到了很多关于这个问题的建议(比如:cache: false),但都没有帮助。我知道我可能漏掉了什么明显的东西,但就是搞不清楚到底是什么。非常感谢任何帮助。

1 个回答

0

看起来处理表单提交的JavaScript代码一开始没什么问题,但其实有一个错误:

var form = $("test_data_form");

如果你使用Firebug或者Chrome的开发者工具在控制台查询这个元素,你会发现什么都查不到,因为你缺少了选择器(比如标签、id、类名等)。从你的表单标签来看,我觉得你是想通过id来选择这个元素:

var form = $("#test_data_form");

撰写回答