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
相关产品推荐
相关产品推荐

