You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django修改URL路由名称后出现404错误求助

问题原因与解决方案

嘿,我来帮你拆解这个问题~你遇到的404和视图匹配错误,本质是Django路由匹配逻辑和模板链接写法不规范共同导致的,具体原因如下:

核心问题1:模板链接硬编码+路由路径不匹配

你把路由的name改成了create-project,但路由的path还是create_project(下划线),而模板里写的是<a href="create-project">(短横线)。这就导致:

  • 当你在某个子页面(比如项目详情页/si/xxx-project/)点击链接时,浏览器会把create-project当作相对路径,拼接成/si/xxx-project/create-project/
  • 这个URL会匹配到你的ProjectDetailView路由(比如类似path('<slug:slug>/', ProjectDetailView.as_view(), ...)的配置),因为create-project会被当作slug参数传入,但数据库里没有这个slug的项目,所以返回404,且显示由ProjectDetailView引发。

核心问题2:未使用Django的URL反向解析

Django推荐用{% url %}模板标签通过路由的name来反向生成URL,而不是硬编码路径。硬编码不仅容易出现拼写不一致的问题,还会在页面路径变化时导致批量修改的麻烦。


修复步骤

1. 统一路由的path和name(可选但推荐)

把路由的path改成和name一致的短横线风格,保持语义统一:

path('create-project', ProjectCreateView.as_view(), name='create-project')

2. 模板中使用{% url %}标签生成正确URL

把模板里的硬编码链接改成反向解析写法:

<a href="{% url 'create-project' %}">
  <img src="{% static 'project_portal/image/icon_add_circle.png' %}" alt="Add" width="32">
</a>

如果你的应用设置了命名空间(比如在根路由里用include(('project_portal.urls', 'project_portal'))),需要加上命名空间前缀:

<a href="{% url 'project_portal:create-project' %}">
  ...
</a>

3. 调整路由顺序(关键!)

确保create-project的路由放在ProjectDetailView的路由前面,因为Django是按顺序匹配路由的。如果详情页路由在前,会优先把create-project当作slug匹配,导致错误。正确的路由顺序应该是:

# 先匹配固定路径的创建页
path('create-project', ProjectCreateView.as_view(), name='create-project'),
# 再匹配动态slug的详情页
path('<slug:slug>/', ProjectDetailView.as_view(), name='project-detail'),

这样修改后,就能确保点击链接时正确跳转到创建项目的视图,不会再触发详情页的404错误啦~

内容的提问来源于stack exchange,提问作者iFunction

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:25:23