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

Posted

技术标签:

【中文标题】Django - 使用 Ajax 的 POST 方法错误“POST /......./ HTTP/1.1”405 0【英文标题】:Django - POST method error "POST /......./ HTTP/1.1" 405 0 with Ajax 【发布时间】:2019-02-26 07:51:57 【问题描述】:

我使用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>

cart/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)

cart/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'),
]

【问题讨论】:

对于数据库中的更改,您应该始终使用 POST。 @guillermochamorro 是的,我正在使用POST 并提到了这一点。 是的,我注意到了,但您也说您尝试使用 GET,而 GET 不是您发送数据以保存在数据库中的方式。 @guillermochamorro 没关系,你知道如何解决这个问题以及导致这个问题的原因吗? 你使用 django 表单吗? 【参考方案1】:

问题是您的表单提交并将请求发送到/book/go-action/,我假设这是表单所在视图的路由,但 POST 应该去的路由是/add_books,如您在urls.py.

要解决此问题,您需要将action 属性添加到您的&lt;form&gt;。这是一个例子:

<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 事件函数将正常工作(据我所知),但在它执行后,提交事件仍然被触发并且默认操作随之而来。要解决此问题,您需要将 event 添加为函数的参数并在该 event 上调用 preventDefault,以便不会发生默认提交。

看起来是这样的:

<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>

【讨论】:

是的,我明白了,谢谢。但我希望它留在同一页面,而不是在我添加书籍后重定向到另一个页面。这就是我使用 Ajax 的原因。我也会上传我的 Ajax 代码。 @Jinx 啊,如果你不能让 Ajax 工作,你可以让add_books 函数返回HttpResponseRedirect('book/go-action'),这样用户就被保留在当前页面上。 真的很抱歉打扰你。因为我想学习如何使用ajax,我想我以后可能会非常需要它。你能看看我的ajax代码吗? @Jinx 是的,不用担心。当您提交表单时,您是否在错误之前获得了预期的行为?意思是一本书被创造了吗?我想知道表单是否提交了两次 不,我按下按钮后它无法立即加载任何内容。 This page isn’t working. If the problem continues, contact the site owner. HTTP ERROR 405。并且数据库没有变化。

以上是关于Django - 使用 Ajax 的 POST 方法错误“POST /......./ HTTP/1.1”405 0的主要内容,如果未能解决你的问题,请参考以下文章

[django]django+post+ajax+highcharts使用方法

如何在Django使用ajax的POST

在 Django 中使用 Ajax Get/Post 方法

使用 AJAX 的 Django POST 不起作用

Django 中间件使用 ajax 使用 HTTPS POST 引发 403 错误

如何使用 Django 和 Jquery 实现 ajax?