如何使用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
相关产品推荐
相关产品推荐

