Django POST提交后重定向回原页面异常跳转index.html问题排查
Django表单提交后重定向根路径异常解决方案
问题场景
开发赛事组织工具时,仅配置了index单视图,根路径/对应页面同时展示三类内容:
- 赛事排行榜
- 未完成赛事表格
- 已完成赛事表格
每场未完成赛事配置了选手比分输入框和对应提交按钮,预期交互流程为:
- 用户点击提交按钮
- 后端接收比分数据写入数据库,标记对应赛事为已完成
- 返回原页面,对应赛事从未完成列表移动到已完成列表
实际运行时提交后无法正常跳回原页面,尝试过三种写法均跳转至不存在的/index.html路径:
# 写法1 if request.method == "POST": return render(request, './')
# 写法2 if request.method == "POST": return redirect(request.path)
# 写法3 if request.method == "POST": return index(request)
当前路由配置如下:
urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), ]
错误原因
三种错误写法的问题点:
render(request, './'):render函数第二个参数是模板文件路径,不是路由地址,传入相对路径./会被模板解析器识别为模板路径,触发路径解析异常- 直接调用
index(request):不会重置请求方法,POST请求直接调用视图返回的响应,会被浏览器按POST请求的路径规则解析,容易触发路径匹配错误 redirect(request.path):如果表单未显式指定提交地址,默认提交路径可能携带隐式的index.html后缀,导致重定向目标错误
修复方案
- 后端视图使用路由名反向解析重定向,这是Django重定向的标准写法,不受路由路径变更影响:
from django.shortcuts import render, redirect def index(request): if request.method == "POST": # 此处编写比分入库、更新赛事状态的业务逻辑 # 业务处理完成后通过路由名重定向 return redirect('index') # GET请求逻辑:查询排行榜、未完成赛事、已完成赛事数据 # 传入模板上下文渲染页面 return render(request, '你的实际模板文件名.html', { # 对应页面需要的上下文变量 })
- 检查模板内的表单标签,显式指定提交地址,不要使用相对路径或留空:
<form method="POST" action="{% url 'index' %}"> {% csrf_token %} <!-- 比分输入框、提交按钮等表单内容 --> </form>
注意:表单内必须添加
{% csrf_token %}标签,否则Django会对POST请求返回403拦截响应,也可能引发跳转异常。
内容的提问来源于stack exchange,提问作者Aske Olesen
相关产品推荐
相关产品推荐

