Django访问URL出现多余斜杠触发404错误的原因及解决方法
Django路径双斜杠导致404问题解决方案
问题根因
- 模板手动添加多余斜杠:你的
product_list.html中跳转链接在{{ instance.get_absolute_url }}后额外拼接了一个斜杠,而Django模型的get_absolute_url方法生成的路径默认已携带末尾斜杠,两者叠加就产生了/products/1//的双斜杠路径,与路由定义的products/<int:id>/规则不匹配。 - 应用路由冗余配置:应用内
urls.py定义了3个空路径的路由,会引发路由匹配优先级混乱,属于不规范配置,可能导致其他路径异常。
修复步骤
- 修改模板代码,移除手动添加的末尾斜杠
{% for instance in object_list %} <p>{{ instance.id }} - <a href="{{ instance.get_absolute_url }}">{{ instance.title }}</a></p> {% endfor %}
注意:Django默认开启APPEND_SLASH配置,会自动给不带末尾斜杠的合法路径补全斜杠,不需要手动在模板中拼接斜杠
- 清理应用路由的冗余配置,避免同路径多视图冲突,修改后的
product/urls.py参考如下:
from django.urls import path from .views import ( product_detail_view, product_create_view, render_initial_data, dynamic_lookup_view, product_delete_view, product_list_view) app_name = 'product' urlpatterns = [ path('', product_list_view, name='product-list'), # 给原空路径的视图分配独立路径,避免冲突 path('create/', product_create_view, name='product-create'), path('<int:id>/', dynamic_lookup_view, name='product-detail'), path('<int:id>/delete/', product_delete_view, name='product-delete'), path('base-detail/', product_detail_view, name='product-base-detail'), ]
- 可选校验:确认
Product模型的get_absolute_url方法定义规范,示例如下:
from django.urls import reverse from django.db import models class Product(models.Model): # 你的模型原有字段 def get_absolute_url(self): return reverse("product:product-detail", kwargs={"id": self.id})
内容的提问来源于stack exchange,提问作者Badabuska
相关产品推荐
相关产品推荐

