Django编辑分类提交POST请求时出现ERROR 404页面未找到问题
Django分类编辑POST请求404问题排查
1. URL路由不匹配
编辑视图的POST请求大概率没对应上带ID的URL路由。比如你可能只配置了GET请求的/category/edit/<int:pk>/,但POST提交的URL没包含ID,或者URL模式没允许POST方法。
检查URLconf里的编辑路由,必须包含pk参数,并且视图支持POST方法:
# 错误写法:缺pk或只支持GET path('category/edit/', views.CategoryEditView.as_view(), name='category_edit') # 正确写法:包含pk,视图默认支持GET/POST path('category/edit/<int:pk>/', views.CategoryEditView.as_view(), name='category_edit')
2. 表单action属性错误
模板里的表单action大概率没指向正确的带ID编辑URL。比如写死了action="/category/edit/",没传入当前分类的ID。
检查模板中的表单标签:
<!-- 错误写法:action不带pk --> <form method="post" action="{% url 'category_edit' %}"> <!-- 正确写法:传入当前分类的pk --> <form method="post" action="{% url 'category_edit' category.pk %}"> {% csrf_token %} <!-- 表单字段 --> </form>
也可以直接省略action,让表单默认提交到当前页面URL,更稳妥。
3. 视图逻辑问题
如果用类视图(比如UpdateView),要确认model、form_class设置正确,get_object方法能正常获取对象。如果是自定义函数视图,要保证POST请求时能正确接收pk参数并查询对象:
# 函数视图示例:POST分支必须正确获取对象 def category_edit(request, pk): category = get_object_or_404(Category, pk=pk) if request.method == 'POST': form = CategoryForm(request.POST, instance=category) if form.is_valid(): form.save() return redirect('category_list') else: form = CategoryForm(instance=category) return render(request, 'category_edit.html', {'form': form})
要是类视图重写了post方法,别错误重定向到不存在的URL,也别漏处理pk参数。
4. CSRF令牌缺失(虽常见403,但可能引发异常跳转)
务必确保表单里有{% csrf_token %},否则Django会拒绝POST请求,若错误处理逻辑有问题,可能跳转到404页面。
5. 对象或权限问题
虽然GET能加载数据,但POST时如果对象已被删除,或者视图权限限制导致无法访问对象,也会返回404。检查get_object_or_404是否在POST分支正确调用,或者权限装饰器是否影响了POST请求。
内容的提问来源于stack exchange,提问作者Davi Souza de Oliveira
相关产品推荐
相关产品推荐

