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
属性添加到您的<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
事件函数将正常工作(据我所知),但在它执行后,提交事件仍然被触发并且默认操作随之而来。要解决此问题,您需要将 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使用方法