You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django博客编辑功能报404错误,请求路径不匹配求排查

问题根源与解决方案

1. 表单提交路径错误(直接触发404)

你的模板中表单的action属性设为"post",这是相对路径写法,会让表单提交时在当前URL后拼接post。比如当前访问blog/edit_post/1,提交后路径会变成blog/edit_post/post,而你的URL规则里没有匹配这个路径的配置,直接导致404错误。

修复模板:
把表单的action改成空字符串(提交到当前URL),或者用Django的{% url %}标签生成精准的编辑URL:

<h1>Edit Post</h1>
<form action="" method='post'>
    {% csrf_token %}
    {{ edit_form.as_p }}
    <button name="submit">Save changes</button>
</form>

更严谨的写法(需在视图中把post传入模板):

<form action="{% url 'edit-post' post.id %}" method='post'>

2. 视图POST请求处理逻辑错误

即使修复了路径,当前视图在处理POST请求时,没有把提交的数据绑定到表单,会导致edit_form.is_valid()永远返回False,无法保存修改。

修复视图:
当请求为POST时,需重新实例化表单并传入request.POST和instance=post:

def edit_post(request, post_id):
    post = Post.objects.get(id=post_id)

    if request.method == 'POST':
        edit_form = PostForm(request.POST, instance=post)
        if edit_form.is_valid():
            mod_post = edit_form.save(commit=False)
            # 可补充设置作者等字段,比如 mod_post.author = request.user
            mod_post.save()
            return redirect('all-posts')  # 用URL名称重定向更可靠
    else:
        edit_form = PostForm(instance=post)

    context_dict = {
        'edit_form': edit_form,
        'post': post  # 若用{% url %}标签需传递该变量到模板
    }
    return render(request, 'blog/edit_post.html', context=context_dict)

额外优化建议

  • 用get_object_or_404替代Post.objects.get(id=post_id),避免post_id不存在时抛出500错误:
    from django.shortcuts import get_object_or_404
    
    post = get_object_or_404(Post, id=post_id)
    
  • 重定向时使用URL名称(如redirect('all-posts'))比直接传视图函数更灵活,后续URL规则变更时无需修改视图代码。

内容的提问来源于stack exchange,提问作者pipocaDourada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:19:21