逻辑:
比如用户商品浏览记录
该用户在首次访问该商品网站的时候, 点击了一个商品, 并进入该商品的详情界面, 这时用户就已经触发了一个浏览的操作, 我们需要记录一下记录该商品的id
goods_id= request.COOKIES.get('商品id', None)
现在我们在获取这个商品id的时候, 一定为空值, 因为我们还没在cookies中进行保存
这时我们可以做个判断
if good_id:
goods_list_id = goods_id.split(',')
这里进行分割, 是因为获取到的goods_id(假如已经存在)是一个字符串的数字, 我们需要将每个商品id进行保存, 这里使用split就非常合适了
if str(infos.id) not in goods_list_id:
这里的判断就需要非常注意了, goods_list_id里面存放的商品id是字符串类型(不信的话, 打个断点瞧瞧), 从数据库以infos.id直接获取的就是数字, 当他两进行比较时, 需要进行转换类型
goods_list_id.insert(0, str(infos.id))
第2个if判断主要意义是:
在用户浏览记录中, 我们一般都是将最后一次浏览的商品显示在浏览记录的开始位置(以此类推), 所以我们使用inser在列表索引为0的位置插入这次浏览此商品的id
else:
goods_list_id.remove(str(infos.id))
goods_list_id.insert(0, str(infos.id))
在这里做的判断就是:
用户在浏览完A商品之后, 过了一会又浏览A商品, 这时我们需要将之前在列表中存放的A商品的id删除, 然后在进行保存, 并放在列表的一个位置上. 这样我们也能完成用户二次浏览商品将商品始终放在浏览记录的第一个位置上, 否则的话会出现一些不可思议的bug
if len(goods_list_id) > 5:
goods_list_id.pop()
在第三个if当中, 我们要判断此时的商品id列表中存放的数量, 因为按照惯例来说, 一个平台是不大可能将用户所有的浏览记录都进行保存, 这样对数据库的使用就有点大(当然也可以采用在一段时间内将其清空), 所以我们就做出一些限制, 让它只保留前五条记录(这里完全由你设定, 只需合理即可), 这样当商品id列表超过五个以后,会将最后一个商品id拿出
goods_id = ','.join(goods_list_id)
当商品id列表中的数据少于5时, 我们需要将这个列表在转化为字符串, 也就是一个一个的字符串类似: 14,13,2,1,28(每一个数字代表一个商品id), 这里的goods_id指的就是他们
else:
goods_id = str(infos.id)
response.set_cookie('goods_id', goods_id)
这里将商品id保存到cookie中, 这样在第一个if中取商品id就有数据了(整个流程当中, 第一个if的else只用一次)
源码:
# 详情
def detail(request):
if request.method == 'GET':
# 商品分类
all_info = Commodity_type.objects.all()
fruit_id = request.GET.get('fruit_id')
try:
infos = Commodity.objects.get(id=fruit_id)
except Exception as e:
return HttpResponse('404')
else:
infos.g_click += 1
infos.save()
result = {
'all_info': all_info,
'infos': infos,
'type': 'goods',
'my_cart_count': ShoopCart.objects.filter(user_id=request.user.id).count()
}
response = render(request, 'df_goods/detail.html', result)
goods_id = request.COOKIES.get('goods_id', None)
if goods_id:
goods_list_id = goods_id.split(',')
if str(infos.id) not in goods_list_id:
goods_list_id.insert(0, str(infos.id))
else:
goods_list_id.remove(str(infos.id))
goods_list_id.insert(0, str(infos.id))
if len(goods_list_id) > 5:
goods_list_id.pop()
goods_id = ','.join(goods_list_id)
print(goods_id)
else:
goods_id = str(infos.id)
# this is dict
response.set_cookie('goods_id', goods_id)
return response