Django模板cart.html中href跳转上层/shop/shirts路由报错如何解决
Django路由反向解析报错解决方案
报错原因
你遇到的Reverse for 'shop' not found报错和路径层级无关,核心原因是Django模板的{% url %}标签是通过**路由命名(name属性)**匹配路径,不是通过URL前缀匹配:你的Django路由配置中没有命名为shop的路由条目,因此反向解析失败。
解决方案
方案1:使用命名路由(推荐)
该方案可维护性最高,后续修改URL路径只要保留name属性,模板代码无需调整。
- 先修改对应路由配置(通常为
shop/urls.py),给目标路径添加name属性,示例配置:
# shop/urls.py from django.urls import path from . import views # 若存在应用命名空间请记住对应名称 app_name = 'shop' urlpatterns = [ # 给/shop/shirts路径添加name属性 path('shirts/', views.shirts_view, name='shirts'), # 其余原有路由保持不变 path('cart/<int:id>/<str:size>/user', views.cart_view, name='cart'), ]
- 修改
cart.html中的跳转代码:
- 如果配置了
app_name = 'shop'应用命名空间,写法为:<a href="{% url 'shop:shirts' %}">跳转到衬衫页面</a> - 如果未配置应用命名空间,写法为:
<a href="{% url 'shirts' %}">跳转到衬衫页面</a>
方案2:硬写路径(临时应急)
如果不需要复用路由配置,可直接写路径实现跳转:
- 绝对路径写法(最稳妥,从站点根路径开始匹配):
<a href="/shop/shirts">跳转到衬衫页面</a> - 相对路径写法(从当前路径向上跳转3层):
<a href="../../shirts">跳转到衬衫页面</a>
注意事项
写绝对路径时必须添加开头的/,如果省略/写为shop/shirts,路径会被自动拼接为当前页面的子路径,最终生成8000/shop/cart/6/M/user/shop/shirts的错误地址。
内容的提问来源于stack exchange,提问作者Omar Shokeir
相关产品推荐
相关产品推荐

