【问题标题】:AJAX with DjangoAJAX 与 Django
【发布时间】:2026-02-14 14:20:04
【问题描述】:

我正在尝试将一个简单的 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>

【问题讨论】:

  • 该视图的 url 模式是什么?
  • url(r^'search/$', views.search, name='search')
  • 正如@ppetrid 在我的回答中所评论的那样,需要澄清您的 js 代码在哪里。它在html模板中吗?如果答案是肯定的,那么请更新您的问题以反映这一点。
  • 它不在模板中,模板标签是一个愚蠢的错误。更改它们后,它仍然无法正常工作。仍然将我发送到返回 Not AJAX 的新页面

标签: javascript jquery python ajax django


【解决方案1】:

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

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

在您的问题中,您说request.is_ajaxFalse,这意味着实际执行了ajax 调用。我认为情况并非如此。鉴于上述代码示例,根本不会发生调用,也不应执行任何视图代码。

【讨论】:

  • 这并没有解决问题。视图被执行。当表单提交时,它会将我带到打印结果的 url。结果是Not AJAX
  • 我可以看到为什么请求不是 AJAX,因为有一个传统的表单提交。但我认为某处一定存在javascript解析错误。由于拼写错误或轻微的解析错误,我经常遇到这种情况。 js 代码无法执行,因此它执行默认的提交操作。尝试在您的 html 中添加一个 void 目标 (
【解决方案2】:

如果你把js和html分开了,为什么在js中使用模板语言。

url: '{% url 'users:search' %}',

我认为你应该这样做:

url: 'search',

【讨论】:

  • 您好,我怀疑 OP 在模板文件中使用了上面的 js 代码,因为他还在那里打印了 csrf 令牌。但这是一个需要澄清的好点。
【解决方案3】:

我已经弄清楚出了什么问题。

我将 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 令牌没有与其余数据一起发送。希望有人能在以后发现这很有用。我犯了一个愚蠢的错误。

【讨论】:

  • 如果您不希望对 post 请求进行 csrf 验证,也可以将 @csrf_exempt 装饰器添加到您的视图方法中。