Javascript AJAX与Django

Javascript AJAX与Django,javascript,jquery,python,ajax,django,Javascript,Jquery,Python,Ajax,Django,我正在尝试将一个简单的AJAX函数与Django结合起来,我不知道我做错了什么。request.is_ajax返回False,即使我执行event.preventDefault,表单仍在提交中 以下是视图: def search(request): if request.is_ajax(): search_text = request.POST.get('search_text', False) else: search_text = 'Not A

我正在尝试将一个简单的AJAX函数与Django结合起来,我不知道我做错了什么。request.is_ajax返回False,即使我执行event.preventDefault,表单仍在提交中

以下是视图:

def search(request):
    if request.is_ajax():
        search_text = request.POST.get('search_text', False)
    else:
        search_text = 'Not AJAX'
    return HttpResponse(search_text)
JS:

$(function(){

    $('#search_form').submit(function(event){
        event.preventDefault();

        $.ajax({
            type: 'post',
            url: {% url 'users:search' %},
            dataType: 'html',
            data: {
                'search_text': $('#search').val(),
                'csrfmiddlewaretoken': '{{ csrf_token }}'
            },
            success: function(data){
                $('#search-results').html(data);
                },
            failure: function(data){
                alert('Got an error');
                }
        });
        return false;
    });

});
以及HTML:

 <div class="col-md-4">
            <h5>Search</h5>
            <form action="{% url 'users:search' %}" method="POST" id="search_form" name="search_form">
                {% csrf_token %}
                <input type="text" id="search" name="search">
                <input type="submit" value="Search">
            </form>
            <ul id="search-results">
                {% if users %}
                    {% for user in users %}
                        <li><a href="{% url 'users:detail' user.id %}">{{ user.username }}</a></li>
                    {% endfor %}
                    {% else %}
                        <p>No user available</p>
                {% endif %}
            </ul>
        </div>

我相信表单实际上总是提交的,因为你的js中有一个错误。在$ajax选项中,url应该用引号括起来:

$.ajax({
    type: 'post',
    url: '{% url 'users:search' %}',
    ...
});

在您的问题中,您说request.is_ajax为False,这意味着实际执行了ajax调用。我想这里不是这样的。鉴于上面的代码示例,调用根本不会发生,并且不应执行任何视图代码。

如果您已将js与html分离,为什么要在js中使用模板语言

url: '{% url 'users:search' %}',
我认为你应该这样做:

url: 'search',

我已经找到了问题所在

我将JavaScript代码更改为:

$(document).ready(function(){

    $('#search_form').submit(function(event){

        event.preventDefault();

        $.ajax({
            type: 'POST',
            url: '/users/search/',
            data: {
                'search_text': $('#search').val(),
                'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val() // properly capture the CSRF Token
            },
            success: function(data){
                $('#search-results').html(data);
                },
            failure: function(data){
                alert('Got an error');
                }
        });

    });
});

错误是CSRF令牌未与其余数据一起发送。希望以后有人能发现这很有用。我犯了一个愚蠢的错误。

该视图的url模式是什么?urlr^'search/$',views.search,name='search'As@ppetrid在我的回答中评论说,需要澄清js代码的位置。它在html模板中吗?如果答案是肯定的,那么请更新你的问题以反映这一点。它不在模板中,模板标签是一个愚蠢的错误。更改后,它仍然无法正常工作。仍然将我发送到新页面,返回的不是没有修复它的Ajax。视图被执行。当表单提交时,它会将我带到url并打印结果。结果不是AJAXI,因为有一个传统的表单提交,所以可以看出请求不是AJAX的原因。但我认为一定有javascript解析错误。这是我经常遇到的,由于拼写错误或一个小的解析错误。js代码无法执行,因此它执行默认的提交操作。尝试在html Hello中添加一个空目标,我怀疑OP在模板文件中使用了上述js代码,因为他也在那里打印csrf令牌。但这是一个很好的观点,需要澄清。如果您不想在post请求上进行csrf验证,您也可以使用@csrf\u豁免decorator来查看方法。