Django-使用Ajax时POST方法错误“ POST /......./ HTTP / 1.1” 405 0

时间:2018-09-21 22:10:52

标签: javascript jquery ajax django

我使用POST方法,因为我需要更改数据库。但是每次我使用POST方法时,都会发生此错误。每次单击按钮时,该页面将不会加载并显示"POST /book/go-action/ HTTP/1.1" 405 0。使用q = request.POST["quantity"]q = request.POST.get('quantity', '')时没有区别。如果我使用GET方法,则不会发生此问题,但是GET方法不能满足需要。另外,我不需要表单中的action,因为我不需要页面重定向到某个地方,而且我正在使用ajax调用函数视图。我该如何解决该问题?

已更新:

该问题是由缺少action="{% url 'cart:add_to_cart' %}"引起的。但是我不希望它重定向到另一个页面,这就是为什么我使用Ajax而不是使用action的原因。我猜如果使用action,那么Ajax将变得毫无意义。

book / detail.html:

<script>
    $(document).ready(function () {
        $("#add").click(function () {
            alert('clicked');
            $.ajax({
                url: '{% url "cart:add_to_cart" %}',
                type: "POST",
                dataType: 'json',
                success: function (response) {
                    $("#cartButton").text("Cart" + "(" + response.quantity + ")");
                },
                error: function (response) {
                    alert('Got an error');
                }
            });
        });
    });
</script>

<form method="post"> {% csrf_token %}
    <select name="quantity">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    <input name="bookID" value=" {{ book.id }} " hidden>
    <button id="add" type="submit"> Add to Cart</button>
</form>

购物车/views.py:

def add_books(request):

    c = Cart.objects.get(user=request.user)

    if request.method == 'POST':
        # q = request.POST["quantity"]
        # book_id = request.POST["bookID"]

        q = request.POST.get('quantity', '')
        book_id = request.POST.get('bookID', '')

       # the rest of the code here         

        return JsonResponse(response)

购物车/urls.py:

app_name = 'cart'
urlpatterns = [
    path('add_books/', views.add_books, name='add_to_cart')
]

book / urls.py:

app_name = 'book'
urlpatterns = [
    path('<slug:slug>/', views.BookDetailView.as_view(), name='detail'),
 name='category_search'),
]

1 个答案:

答案 0 :(得分:1)

问题是您的表单提交了请求并将其发送到/book/go-action/,我认为这是表单所在视图的路由,但是POST应该转到的路由是/add_books根据您的urls.py中的定义。

要解决此问题,您需要向action添加一个<form>属性。这是一个示例:

<form method="post" action="/add_books"> {% csrf_token %}
    <select name="quantity">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    <input name="bookID" value=" {{ book.id }} " hidden>
    <button id="add" type="submit"> Add to Cart</button>
</form>

编辑:Ajax代码(与我上面的代码无关)

我认为这里的主要问题是,尽管click事件函数可以正常工作(据我所知),但在执行后,仍然会触发Submit事件并随后执行默认操作。要解决此问题,您需要将event添加为函数的参数,并在该preventDefault上调用event,以免发生默认的提交。

这是下面的样子:

<script>
    $(document).ready(function () {
        $("#add").click(function (event) {
            event.preventDefault();
            alert('clicked');
            $.ajax({
                url: '{% url "cart:add_to_cart" %}',
                type: "POST",
                dataType: 'json',
                success: function (response) {
                    $("#cartButton").text("Cart" + "(" + response.quantity + ")");
                },
                error: function (response) {
                    alert('Got an error');
                }
            });
        });
    });
</script>