重定向引发Page not found错误,附HTML及Django代码求助
解决表单提交后重定向引发的404错误
咱们从最常见的原因开始一步步排查,帮你解决这个问题:
1. 优先检查URL配置(urls.py)是否匹配
这是导致404最核心的原因——你的表单action指向了/app/save/,但如果这个路径没有在路由系统中映射到save视图,提交后自然会找不到页面。
情况1:直接在项目根urls.py配置
确保根urls.py有如下对应配置:
from django.urls import path from . import views urlpatterns = [ path('', views.top, name='top'), # 对应top页面的根路径 path('app/save/', views.save, name='save'), # 必须和表单action完全一致 ]
情况2:save视图在子app中(用include导入)
如果你的save视图属于某个子app,主项目urls.py会用include导入子app路由,此时子app的urls.py只需配置相对路径:
# 主项目urls.py from django.urls import path, include urlpatterns = [ path('app/', include('your_subapp.urls')), ] # 子app的urls.py from django.urls import path from . import views urlpatterns = [ path('save/', views.save, name='save'), # 拼接后就是/app/save/,匹配表单action ]
2. 检查save视图的重定向逻辑
你提供的save视图代码未写完,但如果表单验证通过后使用了redirect(),一定要确保重定向目标是有效路径:
- 推荐用视图名称(通过
reverse)重定向,避免硬编码路径出错:from django.shortcuts import redirect, reverse, render from .forms import SaveForm def save(request): save_form = SaveForm(request.POST or None) if request.method == "POST" and save_form.is_valid(): # 处理表单数据(比如保存到数据库) save_form.save() # 重定向到top页面,用视图名称更可靠 return redirect(reverse('top')) # 表单无效或GET请求时,返回原页面(必须有这个返回,否则会报错) return render(request, 'top.html', {'save_form': save_form}) - 如果硬编码路径,一定要确保路径正确,比如
return redirect('/')(对应top页面的根路径),而非错误的路径。
3. 优化表单action的写法(避免路径错误)
你当前用了绝对路径/app/save/,没问题,但更推荐用Django模板标签{% url %}动态生成路径,彻底避免路径拼写错误:
<form method="POST" action="{% url 'save' %}"> {% csrf_token %} <!-- 务必添加!Django默认要求CSRF令牌,否则会返回403禁止访问 --> <p>name:<input id="name" type="text" name="NAME"></p> <p>email:<input id="email" type="text" name="email"></p> <p><input type="submit" value="SEND"></p> </form>
4. 确认APPEND_SLASH设置
Django默认APPEND_SLASH=True,会自动将无斜杠的路径重定向到带斜杠的版本,但如果你的settings.py中手动把它设为False,且路由路径与表单action的斜杠不一致,就会触发404。保持默认设置即可:
# settings.py APPEND_SLASH = True
按照上面的步骤排查,基本就能解决这个重定向导致的404问题了!
内容的提问来源于stack exchange,提问作者user9673470
相关产品推荐
相关产品推荐

