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

Django电商网站开发:如何在首页获取Sale分类商品并在店铺页展示其余商品?

问题分析与解决方案

嗨,我来帮你搞定这个电商网站的需求!你的思路没问题,但现有代码里有几个小坑需要调整,咱们一步步来优化:

1. 模型类的规范优化(可选但推荐)

Django里模型类通常采用大驼峰命名法,这样更符合社区规范,也方便后续维护。另外关联的外键类名也要对应修改:

# models.py
class Category(models.Model):  # 类名首字母大写
    name = models.CharField(max_length=200)
    
    def __str__(self):
        return self.name

class Shop(models.Model):  # 类名首字母大写
    s_id = models.AutoField(primary_key=True)
    s_name = models.CharField(max_length=50)
    s_category = models.ForeignKey(Category, on_delete=models.CASCADE)  # 关联修改后的Category类
    s_artical_no = models.IntegerField(default=0)

2. 首页视图的修正

你之前用get()方法会有问题:如果Sale分类下有多个商品,get()会直接抛出MultipleObjectsReturned异常;而且硬编码分类ID(比如4)非常不可靠,万一数据库里Sale分类的ID变化,代码就失效了。咱们改成动态获取分类+筛选多商品的写法:

# views.py
def index(request):
    try:
        # 通过分类名称动态获取Sale分类,避免硬编码ID
        sale_category = Category.objects.get(name="Sale")
        # 筛选该分类下的所有商品,返回查询集(支持多商品)
        prod = Shop.objects.filter(s_category=sale_category)
    except Category.DoesNotExist:
        # 防止Sale分类不存在时网站崩溃,返回空查询集
        prod = Shop.objects.none()
    params = {'prod': prod}
    return render(request, "main/index.html", params)

3. 店铺页面视图的实现

要展示其余商品,用exclude()方法排除Sale分类的商品即可:

# views.py 新增店铺页面视图
def shop_page(request):
    # 筛选出所有不属于Sale分类的商品
    non_sale_prods = Shop.objects.exclude(s_category__name="Sale")
    params = {'non_sale_prods': non_sale_prods}
    return render(request, "main/shop.html", params)

4. 模板示例

首页模板(main/index.html)

<h1>促销商品专区</h1>
{% if prod %}
    <div class="product-list">
        {% for item in prod %}
            <div class="product-item">
                <h3>{{ item.s_name }}</h3>
                <p>分类:{{ item.s_category.name }}</p>
                <p>商品编号:{{ item.s_artical_no }}</p>
            </div>
        {% endfor %}
    </div>
{% else %}
    <p>暂无促销商品</p>
{% endif %}

店铺页面模板(main/shop.html)

<h1>全部商品</h1>
{% if non_sale_prods %}
    <div class="product-list">
        {% for item in non_sale_prods %}
            <div class="product-item">
                <h3>{{ item.s_name }}</h3>
                <p>分类:{{ item.s_category.name }}</p>
                <p>商品编号:{{ item.s_artical_no }}</p>
            </div>
        {% endfor %}
    </div>
{% else %}
    <p>暂无其他商品</p>
{% endif %}

5. URL配置补充

别忘了在项目的urls.py里添加对应的路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # 首页
    path('shop/', views.shop_page, name='shop_page'),  # 店铺页面
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:07:45