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>