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

如何使用Django创建商品独立详情页?对应报错如何解决?

问题根源

你遇到的报错是三个错误共同导致的:

  • 自定义模型主键后没有使用正确的字段名取值,导致传递给URL反转的参数为空
  • URL路由中配置的主键类型和实际主键类型不匹配
  • 详情视图的查询逻辑存在变量未定义的错误

修复步骤

1. 修正模板中的参数传递

你的Product模型自定义了主键字段名为product_id,Django只有在你未显式声明主键时才会自动生成名为id的自增主键,所以模板中调用t.id得到的是空值,这是报错的直接原因。
修改girls_toys.html中的链接代码:

<!-- 修改前 -->
<a href="{% url 'product_detail' t.id %}">
<!-- 修改后 -->
<a href="{% url 'product_detail' t.product_id %}">

你也可以直接用Django通用的pk属性调用主键,写法为t.pk,不用显式写主键字段名,兼容性更好。

2. 修正URL路由的参数类型

你的主键是UUIDField类型,不是整数类型,所以路由中<int:pk>的配置无法匹配UUID值,修改urls.py中的对应配置:

# 修改前
path('products/<int:pk>/', Productdetail, name='product_detail'),
# 修改后
path('products/<uuid:pk>/', Productdetail, name='product_detail'),

3. 修正详情视图的查询逻辑

你当前的视图函数中,接收的参数名为pk,但查询语句中使用了未定义的id变量,同时查询的字段名也和实际主键名不符,修改views.py中的Productdetail函数:

def Productdetail(request,pk):
    # 修改前 product= Product.objects.get(id=id)
    # 修改后 两种写法都可以
    product = Product.objects.get(product_id=pk)
    # 或者用通用pk写法:product = Product.objects.get(pk=pk)
    context = {'product': product}
    return render(request, 'ecomm/product.html', context)

可选优化

你可以在Product模型中添加get_absolute_url方法,后续模板中可以直接调用{{ t.get_absolute_url }}获取详情页链接,不用每次手动写url反转:

class Product(models.Model):
    # 原有字段不变
    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('product_detail', kwargs={'pk': self.pk})

模板中就可以写成:

<a href="{{ t.get_absolute_url }}">

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:00:01