Django按类别获取商品详情求助:视图双变量无法获取数据
解决Django中通过类别+商品Slug获取商品详情的问题
先梳理问题并逐步解决:
先修正模型里的细节错误
你的Model代码有两个小问题,不修正可能导致后续功能异常:
__str__方法缩进错误,必须放在对应类的内部,否则不会生效- Product模型的外键字段名
Category建议改为小写category,遵循PEP8命名规范,避免和类名冲突
修正后的Model代码:
from django.db import models class Category(models.Model): name = models.CharField(max_length=200) slug = models.CharField(max_length=200) def __str__(self): return self.name class Product(models.Model): category = models.ForeignKey(Category, on_delete=models.CASCADE) name = models.CharField(max_length=200, null=False, blank=False) slug = models.CharField(max_length=200, null=False, blank=False) description = models.TextField(max_length=350, null=False, blank=False) image = models.ImageField(null=False, blank=False) quantity = models.IntegerField(null=False, blank=False) def __str__(self): return self.name
实现视图函数
通过两个Slug参数精准定位商品,推荐使用get_object_or_404,当商品或分类不存在时自动返回404页面,无需手动处理异常。提供两种写法,按需选择:
from django.shortcuts import render, get_object_or_404 from .models import Product, Category def product_detail(request, product_category_slug=None, product_slug=None): # 写法1:分步查询,逻辑清晰 # category = get_object_or_404(Category, slug=product_category_slug) # product = get_object_or_404(Product, category=category, slug=product_slug) # 写法2:关联查询,一行代码更简洁 product = get_object_or_404(Product, category__slug=product_category_slug, slug=product_slug) # 将商品数据传递给模板渲染 return render(request, 'products/product_detail.html', {'product': product})
模板中展示商品详情
在指定的模板文件中,直接调用product对象的属性即可展示详情,示例代码:
<h2>{{ product.name }}</h2> <div class="category-tag">所属分类:{{ product.category.name }}</div> <p class="product-desc">{{ product.description }}</p> <img src="{{ product.image.url }}" alt="{{ product.name }}"> <p class="stock-info">剩余库存:{{ product.quantity }}</p>
额外提醒
- 建议给Category和Product的
slug字段添加unique=True参数,避免重复Slug导致查询混乱 - 使用ImageField时,需在settings.py中配置
MEDIA_ROOT和MEDIA_URL,否则图片无法正常加载
内容的提问来源于stack exchange,提问作者dadi game
相关产品推荐
相关产品推荐

