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

Django中product_detail路由反向匹配失败问题求助

解决Django反向路由匹配错误:Reverse for 'product_detail' with empty slug

错误原因

模板渲染时调用get_absolute_url生成链接,但对应的Product实例的slug为空字符串,而路由规则product/<slug:slug>要求slug必须是非空的字母、数字、下划线或连字符组合,导致反向解析失败。

具体修复步骤

1. 修复pre_save信号的判断逻辑

当前信号仅在instance.slug不存在时生成slug,但空字符串会被误判为“已存在”(实际不符合路由要求)。修改信号逻辑,确保空/空白slug都会触发生成:

def pre_save_post_receiver(sender, instance, *args, **kwargs):
    # 检查slug是否为空、None或空白字符
    if not instance.slug or instance.slug.strip() == '':
        instance.slug = create_slug(instance)

pre_save.connect(pre_save_post_receiver, Product)

2. 批量修复现有数据的空slug

针对数据库中已存在的slug为空的Product实例,手动生成slug:
打开Django执行以下代码:

from core.models import Product

for product in Product.objects.filter(slug__isnull=True) | Product.objects.filter(slug=''):
    product.slug = create_slug(product)
    product.save()

3. 优化get_absolute_url的容错性

避免因意外空slug导致模板崩溃,添加判断逻辑:

def get_absolute_url(self):
    from django.urls import reverse
    if self.slug and self.slug.strip():
        return reverse("product_detail", kwargs={'slug': self.slug})
    # 可根据需求替换为默认页面链接,比如首页
    return "#"

4. 修正模型slug字段的默认值

将默认值从空字符串改为None,让信号逻辑更清晰:

slug = models.SlugField(default=None, max_length=500, null=True, blank=True)

额外检查点

  • 确认pre_save信号在Product模型定义之后连接(当前代码位置正确)。
  • 避免手动给Product实例设置空slug,覆盖自动生成逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:03:25