获取推荐商品思路
cookic版
1. 我们可以直接在功能中写这功能, 但是考虑到耦合性(一个功能代码有点长), 所以使用装饰器的方法
def recommend_view(func): def wrapper(detailView,request,goodsid,*args,**kwargs): return func(detailView,request,goodsid,*args,**kwargs) return wrapper class DetailView(View): @recommend_view def get(self,request,goodsid): goodsid = int(goodsid) #根据goodsid查询商品详情信息(goods对象) goods = Goods.objects.get(id=goodsid) content = {'goods': goods} return render(request, 'detail.html', content)
2. 每次点击都要先获取客服端保存的cookie中的客户id, 并把它保存在一个列表中
def recommend_view(func): def wrapper(detailView,request,goodsid,*args,**kwargs): #将存放在cookie中的goodsId获取 cookie_str = request.COOKIES.get('recommend','') #存放所有goodsid的列表 goodsIdList = [gid for gid in cookie_str.split() if gid.strip()] return func(detailView,request,goodsid,*args,**kwargs) return wrapper class DetailView(View): @recommend_view def get(self,request,goodsid): goodsid = int(goodsid) #根据goodsid查询商品详情信息(goods对象) goods = Goods.objects.get(id=goodsid) content = {'goods': goods} return render(request, 'detail.html', content)
3. 我们要返回什么数据, 一个包含商品对象的列表goodsObjList
判断该商品是否存在cookie中, 存在则删除重新添加到首位, 不存在则添加到首位
返回的对象: 1. 不能包含当前商品 2. 只能是当前类别的商品 3. 最多取四条
def recommend_view(func): def wrappeer(detailView, request, goodsid, *args, **kwargs): cookie_str = request.COOKIES.get('recommend', '') # 存放所有goodsid的列表 goodsIdList = [gid for gid in cookie_str.split() if gid.strip()] # 最终需要获取的推荐商品 goodsObjList = [Goods.objects.get(id=gsid) for gsid in goodsIdList if gsid != goodsid and Goods.objects.get(id=gsid).category_id == Goods.objects.get( id=goodsid).category_id][:4] # 判断goodsid是否存在goodsIdList中 if goodsid in goodsIdList: goodsIdList.remove(goodsid) goodsIdList.insert(0, goodsid) else: goodsIdList.insert(0, goodsid) return func(detailView,request,goodsid,*args,**kwargs) return wrappeer class DetailView(View): @recommend_view def get(self, request, goodsid): goodsid = int(goodsid) goods = Goods.objects.get(id=goodsid) content = {'goods': goods} return render(request, 'detail.html', content)
4. 将返回的数据保存在cookie中
装饰器最后返回的func, 就是当前的get, 所以直接使用一个变量response接收func(detailView, request, goodsObjList, *args, **kwargs), 然后设置cookie
def wrappeer(detailView, request, goodsid, *args, **kwargs): cookie_str = request.COOKIES.get('recommend', '') # 存放所有goodsid的列表 goodsIdList = [gid for gid in cookie_str.split() if gid.strip()] # 最终需要获取的推荐商品 goodsObjList = [Goods.objects.get(id=gsid) for gsid in goodsIdList if gsid != goodsid and Goods.objects.get(id=gsid).category_id == Goods.objects.get( id=goodsid).category_id][:4] # 判断goodsid是否存在goodsIdList中 if goodsid in goodsIdList: goodsIdList.remove(goodsid) goodsIdList.insert(0, goodsid) else: goodsIdList.insert(0, goodsid) # 将goodsObjList传递给get方法 response = func(detailView, request, goodsid, goodsObjList, *args, **kwargs) # 将goodsIdList中的数据保存在cookie中 response.set_cookie('recommend', ' '.join(goodsIdList), max_age=60 * 60 * 24 * 7) return response return wrappeer class DetailView(View): @recommend_view def get(self, request, goodsid, recommendList=[]): goodsid = int(goodsid) goods = Goods.objects.get(id=goodsid) content = {'goods': goods, 'recommendList':recommendList} return render(request, 'detail.html', content)

浙公网安备 33010602011771号