Django视图重定向至同一页面触发ERR_TOO_MANY_REDIRECTS错误求助
解决Django视图中重定向导致的ERR_TOO_MANY_REDIRECTS问题
你遇到的这个循环重定向问题其实很好理解——每次当条件不满足时,你把用户重定向到当前视图的URL,而这个请求又会再次触发视图的get方法,条件依然不满足的话就又重定向,无限循环下去,浏览器就会抛出ERR_TOO_MANY_REDIRECTS错误。
而你尝试的return HttpResponseRedirect('')之所以显示空白,是因为空字符串不是有效的跳转目标,视图没有返回任何渲染的页面内容,浏览器自然显示空白。
下面给你几个可行的解决方案:
方案1:在当前请求中处理(推荐)
不要用重定向,而是直接渲染页面,同时把条件不满足的状态传递给模板,在模板里显示提示信息。这样既不会触发循环,用户也能看到反馈。
修改你的视图代码:
from django.views.generic import DetailView class Test(DetailView): # 确保指定你的模板路径和模型 template_name = "your_app/test_detail.html" model = YourTargetModel def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 这里替换成你的实际条件判断 if not self.object.some_field or not self.request.user.is_authenticated: context["condition_failed"] = True return context
然后在对应的模板test_detail.html中添加提示:
{% if condition_failed %} <div class="alert alert-warning"> 条件不满足,请检查相关内容后再尝试! </div> {% endif %} <!-- 原本的页面内容继续保留 --> {{ object.title }} <!-- ...其他内容 -->
方案2:重定向到其他页面
如果条件不满足时不应该停留在当前页面,那就重定向到其他有效的URL,比如列表页、首页或者错误提示页:
from django.http import HttpResponseRedirect from django.urls import reverse class Test(DetailView): def get(self, request, *args, **kwargs): # 先获取对象,因为DetailView需要它 self.object = self.get_object() # 你的条件判断 if not self.object.is_active: # 重定向到列表页,替换成你自己的URL名称 return HttpResponseRedirect(reverse("test_list")) # 条件满足时,执行默认的get逻辑 return super().get(request, *args, **kwargs)
关键提醒
永远不要在视图中重定向到自身URL来处理“停留在当前页面”的需求——这必然会导致循环重定向。正确的做法是在同一个请求周期内完成状态传递和页面渲染,或者跳转到其他独立的URL。
内容的提问来源于stack exchange,提问作者user12151542
相关产品推荐
相关产品推荐

