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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:10:59