def get(self, request, category_id, page_num): # category_id表示第三级分类的编号 # page_num表示第n页数据 # 查询分类数据 categories = get_categories() # 查询第三级分类对象 cat3 = GoodsCategory.objects.get(pk=category_id) breadcrumb = get_breadcrumb(cat3) # 排序规则 sort = request.GET.get('sort', 'default') if sort == 'default': sort_field = '-sales' elif sort == 'price': sort_field = 'price' elif sort == 'hot': sort_field = '-comments' else: sort_field = '-sales' # 热销排行:通过另外一个视图实现 # 查询当前页的商品数据 # 1.查询指定分类的数据 skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by(sort_field) # 2.分页 # 2.1创建分页对象,指定列表、页大小 paginator = Paginator(skus, constants.SKU_LIST_PER_PAGE) # 2.2获取指定页码的数据 page_skus = paginator.page(page_num) # 2.3获取总页数 total_page = paginator.num_pages context = { 'categories': categories, 'breadcrumb': breadcrumb, 'category': cat3, 'page_skus': page_skus, 'page_num': page_num, 'total_page': total_page, 'sort': sort } return render(request, 'list.html', context)
def get(self, request, category_id, page_num): # 查询当前指定的分类对象 try: category3 = GoodsCategory.objects.get(pk=category_id) except: return render(request, '404.html') # 分类 categories = get_category() # 面包屑导航 breadcrumb = get_breadcrumb(category3) # 热销排行(后续通过Ajax实现) # 当前分类的库存商品 skus = category3.sku_set.filter(is_launched=True) # 排序 sort = request.GET.get('sort', 'default') if sort == 'price': # 价格 skus = skus.order_by('price') elif sort == 'hot': # 人气 skus = skus.order_by('-sales') else: # 默认 skus = skus.order_by('-id') # 分页 paginator = Paginator(skus, 5) # 将列表skus按照每页5条数据进行分页 page_skus = paginator.page(page_num) # 获取第page_num页的数据 total_page = paginator.num_pages # 总页数 context = { 'categories': categories, 'breadcrumb': breadcrumb, 'sort': sort, 'page_skus': page_skus, 'category': category3, 'page_num': page_num, 'total_page': total_page } return render(request, 'list.html', context)
def get(self, request, sku_id): try: sku = SKU.objects.get(pk=sku_id) except: return http.Http404('商品编号无效') # 分类数据 categories = get_categories() # 获取面包屑导航 breadcrumb = get_breadcrumb(sku.category) # 获取spu spu = sku.spu # 获取规格信息:sku===>spu==>specs specs = spu.specs.order_by('id') # 查询所有的sku,如华为P10的所有库存商品 skus = spu.skus.order_by('id') ''' { 选项:sku_id } 说明:键的元组中,规格的索引是固定的 示例数据如下: { (1,3):1, (2,3):2, (1,4):3, (2,4):4 } ''' sku_options = {} sku_option = [] for sku1 in skus: infos = sku1.specs.order_by('spec_id') option_key = [] for info in infos: option_key.append(info.option_id) # 获取当前商品的规格信息 if sku.id == sku1.id: sku_option.append(info.option_id) sku_options[tuple(option_key)] = sku1.id # 遍历当前spu所有的规格 specs_list = [] for index, spec in enumerate(specs): option_list = [] for option in spec.options.all(): # 如果当前商品为蓝、64,则列表为[2,3] sku_option_temp = sku_option[:] # 替换对应索引的元素:规格的索引是固定的[1,3] sku_option_temp[index] = option.id # 为选项添加sku_id属性,用于在html中输出链接 option.sku_id = sku_options.get(tuple(sku_option_temp), 0) # 添加选项对象 option_list.append(option) # 为规格对象添加选项列表 spec.option_list = option_list # 重新构造规格数据 specs_list.append(spec) context = { 'sku': sku, 'categories': categories, 'breadcrumb': breadcrumb, 'category_id': sku.category_id, 'spu': spu, 'specs': specs_list } return render(request, 'detail.html', context)
def get_detail_html(sku_id): # 获取当前sku对象 sku = SKU.objects.get(id=sku_id) # 分类数据 categories = get_categories() # 获取面包屑导航 breadcrumb = get_breadcrumb(sku.category) # 获取spu spu = sku.spu # 获取规格信息:sku===>spu==>specs specs = spu.specs.order_by('id') # 查询所有的sku,如华为P10的所有库存商品 skus = spu.skus.order_by('id') ''' { 选项:sku_id } 说明:键的元组中,规格的索引是固定的 示例数据如下: { (1,3):1, (2,3):2, (1,4):3, (2,4):4 } ''' sku_options = {} sku_option = [] for sku1 in skus: infos = sku1.specs.order_by('spec_id') option_key = [] for info in infos: option_key.append(info.option_id) # 获取当前商品的规格信息 if sku.id == sku1.id: sku_option.append(info.option_id) sku_options[tuple(option_key)] = sku1.id # 遍历当前spu所有的规格 specs_list = [] for index, spec in enumerate(specs): option_list = [] for option in spec.options.all(): # 如果当前商品为蓝、64,则列表为[2,3] sku_option_temp = sku_option[:] # 替换对应索引的元素:规格的索引是固定的[1,3] sku_option_temp[index] = option.id # 为选项添加sku_id属性,用于在html中输出链接 option.sku_id = sku_options.get(tuple(sku_option_temp), 0) # 添加选项对象 option_list.append(option) # 为规格对象添加选项列表 spec.option_list = option_list # 重新构造规格数据 specs_list.append(spec) context = { 'sku': sku, 'categories': categories, 'breadcrumb': breadcrumb, 'category_id': sku.category_id, 'spu': spu, 'specs': specs_list } response = render(None, 'detail.html', context) file_name = os.path.join(settings.BASE_DIR, 'static/detail/%d.html' % sku.id) # 写文件 with open(file_name, 'w') as f1: f1.write(response.content.decode())
def get(self, request, sku_id): generate_static_detail_html.delay(sku_id) try: sku = SKU.objects.get(pk=sku_id) except: return render(request, '404.html') # - 频道分类 categories = get_category() # 面包屑导航 category3 = sku.category breadcrumb = get_breadcrumb(category3) # - 库存商品对象(根据主键查询) # 标准商品对象 spu = sku.spu # - 规格选项 # 当前库存商品的选项,如当前库存商品为15号,则当前规格选项信息为:[16,20]===>6,7 # list1=sku.specs.order_by('spec_id') # option_current=[] # for info in list1: # option_current.append(info.option_id) option_current = [ info.option_id for info in sku.specs.order_by('spec_id') ] # 查询所有的库存商品与选项信息 skus = spu.sku_set.filter(is_launched=True) ''' 当前数据,需要包含:库存商品编号,选项列表 当前已知:选项列表,找:库存商品编号 { 选项列表:库存商品编号 } dict1[键]===>值 ''' sku_option_dict = {} for sku_temp in skus: option_list = [ info.option_id for info in sku_temp.specs.order_by('spec_id') ] sku_option_dict[tuple(option_list)] = sku_temp.id ''' { (13,20):9, (13,21):10, ... } ''' # 规格==》选项===》链接 # 查询指定标准商品的所有规格 specs = spu.specs.all() # 6===>0,7=====>1 spec_list = [] for index, spec in enumerate(specs): # [20,5,8,39] spec_dict = {'name': spec.name, 'options': []} # 查询指定规格的所有选项 options = spec.options.all() # 遍历,加入规格字典的列表中 for option in options: # 根据当前选项获取新的完整选项,即保持其它规格的选项不变,只替换本规格的选项 option_current_temp = option_current[:] option_current_temp[ index] = option.id # [16,20]==>[13,20]===>16--->13 sku_id = sku_option_dict.get(tuple(option_current_temp), 0) spec_dict['options'].append({ 'name': option.value, 'selected': option.id in option_current, 'sku_id': sku_id }) spec_list.append(spec_dict) # - 热销排行 context = { 'categories': categories, 'breadcrumb': breadcrumb, 'sku': sku, 'spu': spu, 'category_id': category3.id, 'spec_list': spec_list } return render(request, 'detail.html', context)