django商城项目之历史浏览记录

对于商城项目中的历史浏览记录咱们将它储存在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)