一. 商品详情信息获取和显示
1. 定义视图类
# goods/views.py
from django.core.cache import cache
from django.shortcuts import render, redirect
from django.urls import reverse
from django_redis import get_redis_connection
from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner, IndexPromotionBanner, IndexTypeGoodsBanner
from order.models import OrderGoods
from django.views import View
# /goods/商品id
class DetailView(View):
"""详情页"""
def get(self, request, goods_id):
"""显示详情页"""
try:
sku = GoodsSKU.objects.get(id=goods_id)
except GoodsSKU.DoesNotExist:
# 商品不存在
return redirect(reverse('goods:index'))
# 获取商品的分类信息
types = GoodsType.objects.all()
# 获取商品的评论信息
sku_orders = OrderGoods.objects.filter(sku=sku).exclude(comment='')
# 获取新品信息
new_skus = GoodsSKU.objects.filter(type=sku.type).order_by('-create_time')[:2]
# 获取用户购物车中商品的数目
user = request.user
cart_count = 0
if user.is_authenticated:
# 用户已登录
conn = get_redis_connection('default')
cart_key = 'cart_%d' % user.id
cart_count = conn.hlen(cart_key) # hlen():返回哈希元素的数目
# 组织模板上下文
context = {"sku": sku, "types": types,
"sku_orders": sku_orders,
"new_skus": new_skus,
"cart_count": cart_count}
# 使用模板
return render(request, 'detail.html',context)
2. 定义路由
# goods/urls.py
from django.conf.urls import url
from goods.views import IndexView,DetailView
app_name="goods"
urlpatterns = [
...
url(r'^goods/(?P<goods_id>\d+)$',DetailView.as_view(),name="detail"), # 详情页
]
3. 定义模型
准备中...
二. 用户历史浏览记录添加
1. 在详情视图类添加
# goods/views.py
# 登录后获取浏览记录
# /goods/商品id
class DetailView(View):
"""详情页"""
def get(self, request, goods_id):
"""显示详情页"""
...
if user.is_authenticated:
# 用户已登录
conn = get_redis_connection('default')
cart_key = 'cart_%d' % user.id
cart_count = conn.hlen(cart_key) # hlen():返回哈希元素的数目
# 登录后,添加用户浏览记录
conn = get_redis_connection('default')
history_key = 'history_%d' % user.id
# 移除列表中的goods_id
conn.lrem(history_key, 0, goods_id)
# 把 goods_id 插入到列表的左侧
conn.lpush(history_key, goods_id)
# 只保存用户最新浏览的5条信息
conn.ltrim(history_key, 0, 4)
# 组织模板上下文
...
# 使用模板
...
三. 获取同一个SPU的其他规格商品
1. 在详情视图类添加
# goods/views.py
# /goods/商品id
class DetailView(View):
"""详情页"""
def get(self, request, goods_id):
"""显示详情页"""
# 获取商品的分类信息
...
# 获取商品的评论信息
...
# 获取新品信息
...
# 获取同一个SPU的其他规格商品
same_spu_skus = GoodsSKU.objects.filter(goods=sku.goods).exclude(id=goods_id)
# 获取用户购物车中商品的数目
...
# 组织模板上下文
context = {...
"same_spu_skus":same_spu_skus,
...}
# 使用模板
return render(request, 'detail.html', context)