50 - 项目 -12 - 商品详情

一. 商品详情信息获取和显示

        1. 定义视图类
# goods/views.py

from django.core.cache import cache
from django.shortcuts import render, redirect
from django.urls import reverse
from django_redis import get_redis_connection
from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner, IndexPromotionBanner, IndexTypeGoodsBanner
from order.models import OrderGoods
from django.views import View


# /goods/商品id
class DetailView(View):
    """详情页"""

    def get(self, request, goods_id):
        """显示详情页"""
        try:
            sku = GoodsSKU.objects.get(id=goods_id)
        except GoodsSKU.DoesNotExist:
            # 商品不存在
            return redirect(reverse('goods:index'))

        # 获取商品的分类信息
        types = GoodsType.objects.all()

        # 获取商品的评论信息
        sku_orders = OrderGoods.objects.filter(sku=sku).exclude(comment='')

        # 获取新品信息
        new_skus = GoodsSKU.objects.filter(type=sku.type).order_by('-create_time')[:2]

        # 获取用户购物车中商品的数目
        user = request.user
        cart_count = 0
        if user.is_authenticated:
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)  # hlen():返回哈希元素的数目

        # 组织模板上下文
        context = {"sku": sku, "types": types,
                   "sku_orders": sku_orders,
                   "new_skus": new_skus,
                   "cart_count": cart_count}

        # 使用模板
        return render(request, 'detail.html',context)
        2. 定义路由
# goods/urls.py


from django.conf.urls import url
from goods.views import IndexView,DetailView

app_name="goods"
urlpatterns = [
    ...
    url(r'^goods/(?P<goods_id>\d+)$',DetailView.as_view(),name="detail"), # 详情页
]
        3. 定义模型

                准备中...

二. 用户历史浏览记录添加

        1. 在详情视图类添加
# goods/views.py

# 登录后获取浏览记录
# /goods/商品id
class DetailView(View):
    """详情页"""

    def get(self, request, goods_id):
        """显示详情页"""
        ...
        if user.is_authenticated:
            # 用户已登录
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)  # hlen():返回哈希元素的数目

            # 登录后,添加用户浏览记录
            conn = get_redis_connection('default')
            history_key = 'history_%d' % user.id
            # 移除列表中的goods_id
            conn.lrem(history_key, 0, goods_id)
            # 把 goods_id 插入到列表的左侧
            conn.lpush(history_key, goods_id)
            # 只保存用户最新浏览的5条信息
            conn.ltrim(history_key, 0, 4)

        # 组织模板上下文
        ...

        # 使用模板
        ...

 

三.  获取同一个SPU的其他规格商品

        1. 在详情视图类添加
# goods/views.py

# /goods/商品id
class DetailView(View):
    """详情页"""

    def get(self, request, goods_id):
        """显示详情页"""

        # 获取商品的分类信息
        ...

        # 获取商品的评论信息
        ...

        # 获取新品信息
        ...

        # 获取同一个SPU的其他规格商品
        same_spu_skus = GoodsSKU.objects.filter(goods=sku.goods).exclude(id=goods_id)

        # 获取用户购物车中商品的数目
        ...

        # 组织模板上下文
        context = {...
                   "same_spu_skus":same_spu_skus,
                  ...}

        # 使用模板
        return render(request, 'detail.html', context)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值