Django应用中用户删除网站消息后如何实现正确的页面重定向?
问题原因及解决方案
跳转路径错误的原因
你调用redirect()时传入的是相对路径room/{room_id},相对路径会以当前页面的URL为基准拼接,你当前删除页面的URL是/delete-message/10/,拼接后自然就得到了错误的/delete-message/10/room/5地址。
非空约束报错的原因
你修改后的方案将表单action指向了room页面的路由,删除操作的POST请求会直接提交到room对应的视图函数。通常room视图的POST逻辑是用来提交新消息的,你没有传递body(消息内容)参数,触发了数据库字段的非空约束,才会报NOT NULL constraint failed: BaseApp_message.body错误,这个方案逻辑错误,不要使用。
正确解决方法
推荐使用Django命名路由的方式跳转,无需手动拼接路径,避免出错:
- 先确认你
urls.py中房间页面的路由已经设置了name属性,示例如下:
# urls.py 中已有的room路由,确保配置了name='room' path('room/<str:pk>/', views.room, name='room')
- 修改
delete_message视图中的redirect逻辑:
@login_required def delete_message(request, pk): message = Message.objects.get(id=pk) room_id = message.room.id if request.method == 'POST': message.delete() # 直接用命名路由跳转,传入pk参数即可 return redirect('room', pk=room_id) return render(request, 'delete-message.html')
- 无需修改
delete-message.html的表单代码,保持原来无action属性的状态即可(无action默认提交到当前页面路由,逻辑是正确的)。
如果你不想用命名路由,也可以手动拼接绝对路径,在路径前加/代表从站点根路径开始计算:
return redirect(f'/room/{room_id}')
内容的提问来源于stack exchange,提问作者user17228732
相关产品推荐
相关产品推荐

