Django瀏覽記錄
邏輯:
比如使用者商品瀏覽記錄
該使用者在首次訪問該商品網站的時候, 點選了一個商品, 並進入該商品的詳情介面, 這時使用者就已經觸發了一個瀏覽的操作, 我們需要記錄一下記錄該商品的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