Django3.2项目访问/products路径返回Page not found (404)错误求解
问题根因
你当前定义的products路由规则为products/<slug:tag>/,有两个必须满足的匹配条件:
- 路径必须携带
tagslug参数 - 路径末尾必须带斜杠
你访问的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
相关产品推荐
相关产品推荐

