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

Django3.2项目访问/products路径返回Page not found (404)错误求解

问题根因

你当前定义的products路由规则为products/<slug:tag>/,有两个必须满足的匹配条件:

  • 路径必须携带tag slug参数
  • 路径末尾必须带斜杠
    你访问的http://127.0.0.1:8000/products既没有携带tag参数,也没有末尾斜杠,自然无法匹配到对应路由,触发404。

解决方案

推荐两种适配方案,按需选择即可:

方案1:支持无参数访问/products展示全部商品

第一步:修改urls.py的路由配置

新增无tag参数的products路由,指向同一个列表视图:

urlpatterns = [
    # 原有其他路由保持不变
    path(
        "products/",
        views.ProductListView.as_view(),
        name="products"
    ),
    path(
        "products/<slug:tag>/",
        views.ProductListView.as_view(),
        name="products_with_tag"
    ),
    # 原有其他路由保持不变
]

第二步:修改ProductListView适配无参数场景

调整get_queryset方法,处理tag参数不存在的情况:

def get_queryset(self):
    # 从路径参数中取tag,不存在则默认设为all
    tag = self.kwargs.get('tag', 'all')
    self.tag = None
    if tag != "all":
        self.tag = get_object_or_404(
            models.ProductTag, slug=tag 
        )
    if self.tag:
        products = models.Product.objects.active().filter(
            tags=self.tag 
        )
    else:
        products = models.Product.objects.active()

    return products.order_by("name")

修改完成后访问/products就会默认展示全部商品,访问/products/对应标签slug/会展示对应分类的商品。

方案2:保持原有逻辑不变

你现有代码已经做了tag为all时展示全部商品的逻辑,直接访问http://127.0.0.1:8000/products/all/即可正常访问全部商品列表。

补充说明

Django默认开启APPEND_SLASH配置,当你访问的路径不带末尾斜杠,但存在对应带斜杠的路由时,会自动301重定向到带斜杠的路径,建议日常访问时统一带末尾斜杠,避免不必要的跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:06:01