django之商品最近浏览记录实现

本文详细介绍如何利用Cookie技术在用户浏览商品时记录其浏览历史,包括如何存储和读取商品ID,以及如何处理浏览记录的顺序和数量限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在浏览网页的时候经常会在购买商品的时候,发现有个最近浏览记录,显示你浏览过的商品,这些都是怎么做的?
其实主要用是cookie技术。
通常,每查看一个商品的详细信息,我们算作一次浏览记录。

假设下面为我们的商品详情页逻辑。

def detail(request,id):
    '''
    商品详情页
    :param request:
    :return:
    '''
    goods = GoodsInfo.objects.get(id=id)
    goods.g_click += 1
    goods.save()

    # 获取新品推荐的商品
    news_goods = GoodsInfo.objects.all().order_by('-id')[:2]
    title = '天天生鲜-{}'.format(goods.g_title)
    is_detail = 1
    has_cart = 1
    goods = goods
    response = render(request,'fs_goods/detail.html',locals())

那么接下来我们就需要先从本地cookies获取该商品的浏览记录信息,如果有记录则直接获取,反之就把当前这个商品作为浏览记录保存到cookies中。

cookies = request.COOKIES.get('goods_cookies','')

紧接着做出判断,

    if cookies == '':
        # 说明是第一次浏览商品详情,本地还没有生成商品的cookie信息,那么直接将这个商品的id存到cookie。
        cookies = id+';'       # '1;2;3;'
    elif cookies != '':
        # 说明不是第一次浏览商品详情,本地已经存在商品的cookie信息了;
        # 从'1;2;3;'这个cookie字符串中,取出每一个商品的id
        goods_id_list = cookies.split(';')   	 # ['1','2','3']
        # 判断当前浏览的这个商品的id是否存在于这个goods_id列表中,存在说明商品之前浏览过,不存在说明之前没有浏览过 。

对于浏览记录,平时我们看到的大抵有两种。一是只考虑cookie是否存在,不考虑顺序问题。二是考虑cookie是否存在,同时考虑顺序问题,将最近点击的商品记录展示在最前面。
(1)、第一种方案,只考虑cookie是否存在,不考虑顺序问题

if id in goods_id_list:
   	return response
else:
    goods_id_list.insert(0,id)
    cookies = ';'.join(goods_id_list)
    response.set_cookie('goods_cookies',cookies)
    return response

(2)、第二种方案,考虑cookie是否存在,同时考虑顺序问题,将最近点击的商品记录展示在最前面。(假设我们最近浏览记录只展示5条)

if id in goods_id_list:
     # 说明当前这个商品记录已经存在了,将这个记录从cookie中删除
     goods_id_list.remove(id)
 goods_id_list.insert(0,id)

if len(goods_id_list) >= 6:
    goods_id_list = goods_id_list[:5]
cookies = ';'.join(goods_id_list)

response.set_cookie('goods_cookies', cookies)
return response

最后将其从cookie中取出,将其展示到需要的地方。

# 从本地cookie读取商品的浏览记录
    cookies = request.COOKIES.get('goods_cookies','')
    goods_list = []
    if cookies != '':
        goods_id_list = cookies.split(';')
        for goods_id in goods_id_list:
            if goods_id:
                good = GoodsInfo.objects.get(id=int(goods_id))
                goods_list.append(good)
            else:   
                continue
    return render(request, 'fs_user/user_center_info.html', locals())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值