对于商城项目中的历史浏览记录咱们将它储存在redis缓存中,便于存储和拿取数据,
而咱们首先要明确历史记录何时添加,何时获取html
添加 | 访问商品详情页面的时候,须要添加历史浏览记录 |
---|---|
获取 | 访问用户中心我的信息页的时候,须要获取历史记录 |
每一个用户的历史浏览记录用一条数据保存:最后浏览的记录应该最左侧
list:使用list类型保存用户的历史浏览记录
history_用户id:[1,2,3]
历史浏览记录的html页面:web
<h3 class="common_title2">最近浏览</h3> <div class="has_view_list"> <ul class="goods_type_list clearfix"> {% for goods in goods_li %} <li> <a href="detail.html"><img src="{{ goods.image.url }}"></a> <h4><a href="detail.html">{{ goods.name }}</a></h4> <div class="operate"> <span class="prize">¥{{ goods.price }}</span> <span class="unit">{{ goods.price }}/{{ goods.unite }}</span> <a href="#" class="add_goods" title="加入购物车"></a> </div> </li> {% empty %} 无历史浏览记录 {% endfor %} </ul> </div>
添加views:redis
# 商品详情页 class DetailView(View): def get(self, request, id): try: # 获取数据 goods = GoodsSKU.objects.get(id=id) except GoodsSKU.DoesNotExist: # 商品不存在 return redirect(reverse('goods:index')) # 获取商品分类信息 types = GoodsType.objects.all() # 获取评论信息 sku_orders = OrderGoods.objects.filter(sku=goods).exclude(comment='') # 获取最新商品信息 new_sku = GoodsSKU.objects.filter(type=goods.type).order_by('-create_time')[:2] # 获取同一规格spu商品 same_spu_skus = GoodsSKU.objects.filter(goods=goods.goods).exclude(id=id) context = {'goods': goods, 'types': types, 'sku_orders': sku_orders, 'new_sku': new_sku, 'same_spu_skus': same_spu_skus } # 建立user对象 user = request.user if user.is_authenticated(): # 获取未登陆时购物车中的数量 con = get_redis_connection('default') cart_key = 'cart_%d' % user.id cart_count = con.hlen(cart_key) # 判断是否存在历史记录 # 连接redis数据库 con = get_redis_connection('default') history_key = 'history_%d' % user.id # 删除表中相同的 con.lrem(history_key, 0, id) # 添加历史记录 # 使用lpush添加 con.lpush(history_key, id) # 只保存5个 con.ltrim(history_key, 0, 4) # 组织模板的上下文 context.update(cart_count=cart_count) return render(request, 'apps/detail.html', context)
获取:数据库
class UserInfo(LonginRequiredMixin, View): """用户中心""" def get(self, request): # page = 'user' # request.user # 若是用户未登陆-->An...类的实例------is_authenticated() False # 若是说此时用户已经登陆,--->User类的实例----is_authenticated() True # request.user.is_authenticated() # 除了你给模板文件传递模板变量以外,django框架会把request.user传递给模板文件中 # 获取用户的我的信息 user = request.user address = Address.objects.get_default_address(user) # try: # # address = Address.objects.get(user=user, is_default=True) # # except Address.DoesNotExist: # # # 不存在默认的地址 # address = None # 历史浏览记录 # 连接redis数据库 # con = StrictRedis(host='127.0.0.1', port=6379, db=9) con = get_redis_connection('default') history_key = 'history_%d' % user.id # # 取用户redis中的浏览的五个商品id sku_ids = con.lrange(history_key, 0, 4) # 获取用户id # 添加到列表中显示 goods_li = [] # goods = GoodsSKU.objects.filter(id__in=sku_ids) # for s_id in sku_ids: # for good in goods: # if s_id == good.id: # goods_li.append(good) # 第二种简写 for s_id in sku_ids: good = GoodsSKU.objects.get(id=s_id) goods_li.append(good) # 上下文管理器 context = {'page': 'userinfo', 'address': address, 'goods_li': goods_li} return render(request, 'apps/user_center_info.html', context)