Django,通过 AJAX 提交表单

Django, submiting a form via AJAX

我看过类似问题的答案 (here and here),但其中 none 对我有效。我在模板中有一个简单的表单,我正在使用 bootstrap 进行渲染。

提交表单后,响应直接呈现在浏览器中。当我 return 到上一页(使用浏览器的按钮)时,将执行 AJAX 调用的 成功 部分。

forms.py

class QueryForm(forms.Form):
    query = forms.CharField(label='Discover something', max_length=256)

views.py

def query_view(request, id):
    if request.method == 'POST':
        # Just for testing, send True
        response_data = {
            'result': True
        }

        return HttpResponse(json.dumps(response_data), content_type="application/json")
    else:
        try:
            # Create a form and send it to the template
            query_form = QueryForm()

            return render(request, 'query_template.html', {'query_form': query_form})
        except ObjectDoesNotExist:
            return render(request, 'error.html')

urls.py

urlpatterns = [
    url(r'^query', views.query_view, name='query_view'),
    url(r'^', views.home, name='home'),
]

query_template.html

{% extends 'base.html' %}

{% load static %}
{% load bootstrap3 %}

{% block content %}

    {# Display a form #}
    <form method="post" class="form">
        {% csrf_token %}
        {% bootstrap_form query_form %}
        {% buttons %}
            <button class="btn btn-primary" id="query-button">
                {% bootstrap_icon "star" %} Submit
            </button>
        {% endbuttons %}
    </form>
    <ul id="result"></ul>

    <script src="{% static 'scripts/main.js' %}"></script>
{% endblock %}

main.js

$('#query-button').click(function (event) {
    $.ajax({
        url: "/query/",
        type: "POST",
        data: {},
        cache: false,

        // handle a successful response
        success: function (json) {
            console.log(json); // log the returned json to the console
            $("#result").html("<li>" + json.result + "</li>");
            console.log("success"); // another sanity check
        },

        // handle a non-successful response
        error: function (xhr, errmsg, err) {
            console.log(xhr.status + ": " + xhr.responseText);
        }
    });
});

// It also includes functions to manage the CRFS token

我一直在玩代码。如果不是我使用 <input><button id='query-button'> 的表单,它会在不重新加载页面的情况下呈现响应。

您可以使用 FormData 而不是自定义发送数据,打开以下链接:

How to send FormData objects with Ajax-requests in jQuery?

https://developer.mozilla.org/en-US/docs/Web/API/FormData

您需要阻止 HTML 表单的默认提交操作,通过 event.preventDefault()