Django表单POST请求失效,始终返回GET请求问题求助
问题说明
嵌入表格单元格的表单明明设置了POST请求,但后端request.method始终返回GET,POST分支的逻辑根本触发不了。
前端表单代码
<form method="post"> {% csrf_token %} <div class="mb-3"> <input type="hidden" class="form-control" id="url" name="delete-id" value="{{ url.id }}"> </div> <div class="mb-3"> <button type="submit" class="btn btn-primary mb-3">Delete</button> </div> </form>
后端视图代码
@login_required def website(request, website_id): if request.method == 'POST': Url.objects.get(id=request.GET['delete-id']).delete() customer_id = request.session.get('customer_id') context = { 'website': Website.objects.get(id=website_id, customer__id=customer_id) } return render(request, 'main/website.html', context)
排查与修复步骤
检查表单是否嵌套:如果这个表单被放在另一个
<form>标签内部,浏览器会直接忽略内层表单的method设置,默认用外层表单的提交方式(通常是GET)。去页面HTML结构里确认,每个表单都是独立的顶级元素,没有嵌套情况。排查JS或父元素的干扰:虽然按钮是
type="submit",但如果按钮所在的表格行、单元格有绑定的JavaScript点击事件(比如跳转链接),可能会优先触发GET请求。可以临时移除页面其他JS代码,测试是否能正常提交POST。修正后端视图的逻辑错误:就算POST请求正常到达,你的视图代码也有问题——在POST分支里用了
request.GET['delete-id'],POST参数应该从request.POST里取,而且要用get方法避免KeyError,同时建议加异常捕获防止找不到ID的情况:if request.method == 'POST': url_id = request.POST.get('delete-id') if url_id: try: Url.objects.get(id=url_id).delete() except Url.DoesNotExist: pass # 这里可以根据需求加错误提示确认CSRF令牌正常生成:查看页面源代码,确认
{% csrf_token %}是否渲染出了<input type="hidden" name="csrfmiddlewaretoken" value="xxx">这个字段。如果没有,检查模板是否正确继承了带CSRF的基础模板,或者是否在视图中正确传递了上下文(用render的话默认会处理)。查看实际请求类型:打开浏览器开发者工具(F12)的「网络」标签,点击提交按钮,看请求的方法是GET还是POST:
- 如果是GET,说明前端提交逻辑有问题(嵌套表单、JS拦截等)
- 如果是POST但后端仍识别为GET,检查是否有中间件或反向代理(比如Nginx)修改了请求方法
内容的提问来源于stack exchange,提问作者Catalin Briscan

