求助:如何解决Django中出现的Method Not Allowed (POST)错误?
求助:如何解决Django中出现的Method Not Allowed (POST)错误?
嘿,我看你正在开发Django的POS系统,遇到POST方法不允许的错误了对吧?先看看你提供的模板代码,我帮你梳理几个最可能的原因和解决办法:
首先,先把你的模板代码贴出来方便分析:
{% load multiply %} <!DOCTYPE html> <html> <head> <title>Order Details</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="{% url 'posApp:home' %}">POS System</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="{% url 'posApp:home' %}">Home <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'posApp:order_list' %}">Orders</a> </li> </ul> </div> </nav> <div class="container mt-4"> <h2>Current Order</h2> <table class="table table-striped"> <thead> <tr> <th>Product</th> <th>Quantity</th> <th>Price</th> <th>Total</th> <th>Actions</th> </tr> </thead> <tbody> {% for item in order_items %} <tr> <td>{{ item.product.name }}</td> <td> <input type="number" class="form-control quantity-input" data-item-id="{{ item.id }}" value="{{ item.quantity }}" min="1"> </td> <td>{{ item.product.price }}</td> <td>{{ item.product.price|multiply:item.quantity }}</td> <td> <button class="btn btn-danger delete-item" data-item-id="{{ item.id }}">Delete</button> </td> </tr> {% endfor %} </tbody> </table> <div class="text-right"> <h4>Total: {{ total_amount }}</h4> <button class="btn btn-success checkout-btn">Checkout</button> </div> <hr> <h3>Add Item to Order</h3> <form method="POST"> {% csrf_token %} <div class="form-group"> <label for="product">Product</label> <select class="form-control" id="product" name="product"> {% for product in products %} <option value="{{ product.id }}">{{ product.name }} - {{ product.price }}</option> {% endfor %} </select> </div> <div class="form-group"> <label for="quantity">Quantity</label> <input type="number" class="form-control" id="quantity" name="quantity" min="1" value="1"> </div> <button type="submit" class="btn btn-primary">Add Item</button> </form> </div> <script> // Handle quantity updates $('.quantity-input').change(function() { var itemId = $(this).data('item-id'); var quantity = $(this).val(); $.ajax({ url: "{% url 'posApp:update_quantity' %}", method: "POST", data: { 'item_id': itemId, 'quantity': quantity, 'csrfmiddlewaretoken': '{{ csrf_token }}' }, success: function(response) { location.reload(); } }); }); // Handle item deletion $('.delete-item').click(function() { var itemId = $(this).data('item-id'); if (confirm('Are you sure you want to delete this item?')) { $.ajax({ url: "{% url 'posApp:delete_item' %}", method: "POST", data: { 'item_id': itemId, 'csrfmiddlewaretoken': '{{ csrf_token }}' }, success: function(response) { location.reload(); } }); } }); // Handle checkout $('.checkout-btn').click(function() { $.ajax({ url: "{% url 'posApp:checkout' %}", method: "POST", data: { 'csrfmiddlewaretoken': '{{ csrf_token }}' }, success: function(response) { alert('Order completed successfully!'); window.location.href = "{% url 'posApp:home' %}"; } }); }); </script> </body> </html>
从模板来看,你已经用了POST表单和AJAX POST请求,那错误大概率出在视图或者URL配置上,我给你列几个排查方向:
- 视图没处理POST请求:比如你的
update_quantity、delete_item、checkout这些视图函数,有没有判断请求方法是POST?举个例子,update_quantity视图应该这么写:
from django.http import JsonResponse def update_quantity(request): if request.method == 'POST': item_id = request.POST.get('item_id') quantity = request.POST.get('quantity') # 这里写更新订单商品数量的逻辑,比如找到对应Item对象修改save() return JsonResponse({'status': 'success'}) # 如果不是POST请求,返回405错误(也就是你遇到的Method Not Allowed) return JsonResponse({'status': 'error'}, status=405)
要是你没写if request.method == 'POST',或者视图默认只处理GET,那肯定会报错。
- URL配置限制了请求方法:检查你的
urls.py里,这些视图的路径有没有加methods参数限制只能用GET?比如如果写了:
path('update-quantity/', views.update_quantity, name='update_quantity', methods=['GET'])
那POST请求肯定会被拒绝,要把methods改成['POST']或者直接删掉这个参数(默认允许所有方法)。
AJAX请求的URL不对:看看模板里AJAX的
url用的{% url 'posApp:update_quantity' %}是不是和urls.py里的name对应?如果URL路径写错了,请求可能发到了其他不支持POST的视图上,比如首页视图,那也会触发这个错误。别忘了CSRF令牌:不过看你的模板里AJAX已经带了
csrfmiddlewaretoken,表单也加了{% csrf_token %},这个应该没问题,但还是确认一下,要是没加的话Django也会拒绝POST请求(不过报错信息会不一样,但还是提一下)。
你可以先按这几个方向排查,先看对应视图的代码,再检查URL配置,应该能找到问题~
备注:内容来源于stack exchange,提问作者Mohamed Abdillah
相关产品推荐
相关产品推荐

