删除详情视图对象后如何实现重定向?
解决Django删除Thread后无法重定向的问题
核心原因
你猜的没错——如果先执行thread.delete()再获取thread.forum,此时Thread对象已经从数据库中删除,关联的forum属性会直接失效(甚至抛出DoesNotExist异常),自然无法生成正确的重定向URL。
修复方案
1. 调整视图代码顺序
把获取关联forum对象的操作,提前到删除Thread之前:
from django.shortcuts import get_object_or_404, redirect from .models import Thread def thread_delete(request, pk): thread = get_object_or_404(Thread, pk=pk) # 先保存要跳转的forum对象,再执行删除 target_forum = thread.forum thread.delete() # 重定向到对应forum的帖子列表页 return redirect('forum_thread_list', forum_pk=target_forum.pk)
2. 验证URL配置匹配
确保你的URL名称forum_thread_list能正确接收forum_pk参数,示例配置:
# urls.py from django.urls import path from . import views urlpatterns = [ # 其他URL配置... path('forums/<int:forum_pk>/threads/', views.thread_list, name='forum_thread_list'), ]
3. 模板表单路径验证
确认模板中删除表单的提交路径正确指向删除视图:
<!-- 示例模板代码 --> <form method="post" action="{% url 'thread_delete' thread.pk %}"> {% csrf_token %} <button type="submit">删除该帖子</button> </form>
额外提醒
如果需要限制删除权限(比如仅帖子作者可删除),可以在视图中添加判断逻辑:
def thread_delete(request, pk): thread = get_object_or_404(Thread, pk=pk) if request.user != thread.author: # 无权限时直接跳回列表页 return redirect('forum_thread_list', forum_pk=thread.forum.pk) target_forum = thread.forum thread.delete() return redirect('forum_thread_list', forum_pk=target_forum.pk)
内容的提问来源于stack exchange,提问作者iGiveDrinks
相关产品推荐
相关产品推荐

