点击创建新帖按钮报错:service.views.create_post未返回HttpResponse
错误原因与修复方案
问题根源
这个错误的核心是:Django视图函数必须始终返回一个HttpResponse对象,但你的create_post视图在处理GET请求时,没有返回任何内容,函数执行到最后返回了None。
看代码逻辑:
- 当用户点击“创建新帖子”(发起GET请求),视图仅初始化了
form = PostForm(),但没有后续的return语句来返回渲染表单的页面。 - 只有POST请求的分支里有return语句,GET请求走到函数末尾就默认返回None,触发了报错。
修复代码
修改后的create_post视图需要确保所有请求路径都有返回值,在函数末尾添加GET请求对应的返回逻辑:
@login_required @permission_required("service.add_post") def create_post(req): form = PostForm() if req.method == "POST": form = PostForm(req.POST) if form.is_valid(): form.save() title = form.cleaned_data.get("title") if title != "POST": messages.error(req, f"Something went wrong") return redirect('index') # 注意:form.cleaned_data里没有pk,刚保存的对象主键需从实例获取 post = form.save() messages.success(req, f"Post {title} was created successfully") return redirect('index') # POST请求但表单验证失败,返回带错误的表单页面 return render(req, "create_post.html", {"form":form}) # GET请求,返回空表单页面 return render(req, "create_post.html", {"form":form})
额外提示
代码里的id = form.cleaned_data.get("pk")是无效的——cleaned_data里不会包含pk(主键是数据库自动生成的,不属于表单提交字段),如果需要获取新建帖子的主键,应该用post = form.save(),然后通过post.pk获取。
内容的提问来源于stack exchange,提问作者Eva Smirnova
相关产品推荐
相关产品推荐

