13.Django大型电商项目之商品详情页中的推送商品

1.商品详情推送之猜你喜欢

1.1 概述

对于猜你喜欢,我的思路是根据用户之前的访问,按照时间顺序进行排序,然后选择前几个展示在猜你喜欢的栏目中。
具体的实现流程是做一个装饰器放在商品详情的视图上。这个装饰器,是通过COOKIE去记录用户之前的访问过的商品id,再通过排除当前的商品id,保存这些id的数据到列表中,再让商品详情视图传递这个列表到前端的html中进行展示。

1.2 代码展示

views

def recommend(func):
    def inner(request, goodsid, *args, **kwargs):
        # 浏览商品id,第一次从cookie中获取浏览商品id(由空格拼接的字符串)
        c_goodsIdList = request.COOKIES.get('recommend_goodsid','')
        # 将由空格拼接的字符串,转化成列表
        goodsIdList = [id for id in c_goodsIdList.split() if id.strip()]
        # 先判断当前浏览的商品是否在浏览列表中,如果存在先删除,再将商品插入列表第一位
        if str(goodsid) in goodsIdList:
            goodsIdList.remove(str(goodsid))
        goodsIdList.insert(0,goodsid)
        # 根据推荐商品id获取商品信息:循环遍历cookie中保存的商品id,如果和当前商品id不一样并且分类与当前浏览的商品id相同的话,获取前4个商品id
        goodsObjectsList = [Goods.objects.get(id=gid) for gid in goodsIdList if gid!=goodsid and Goods.objects.get(id=gid).category.id == Goods.objects.get(id=goodsid).category.id][:4]
        # 使用COOKIE保存浏览商品id
        # 获取response:就是相当于主页的商品点击链接goodsdetails
        response = func(request, goodsid, recommend_list=goodsObjectsList, *args, **kwargs)
        # 获取cookie
        response.set_cookie('recommend_goodsid',' '.join([str(id) for id in goodsIdList]), max_age=3*24*3600)
        return response
    return inner


@recommend
# 根据商品id获取商品详情
def goodsdetails(request,goodsid,recommend_list=[]):
    # 根据商品id获取商品
    try:
        goods = Goods.objects.get(id=goodsid)
        return render(request, 'goodsapp/goodsdetail.html',{'goods':goods,'recommend_list':recommend_list})
    except Goods.DoesNotExist:
        return HttpResponse(status=404)

templates

<div class="goods-model" style="margin-right: -18px;text-align: center">
    <img src="{% static '/images/recommend.png' %}" style="position: relative;left: -10px;top: 10px">
    <div class="goods-content">
        {% for goods in recommend_list %}
            <div class="good">
                <a href="/goodsdetails/{{goods.id}}">
                    <img src="{{goods.getImgUrl}}" width="285px" height="285px">
                    <p class="name">{{goods.gname}}</p>
                    <div class="price">
                        <i></i>
                        <p class="big">{{goods.price}}</p>
                        <s>¥{{goods.oldprice}}</s>
                    </div>
                    <div class="sale">
                        特卖
                    </div>
                </a>
            </div>
        {% endfor %}
    </div>
</div>

1.3 效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值