def generate_static_list_search_html(template_name): """生成静态的商品列表页和搜索结果页html文件 :param template_name: 需要生成的模板名称 """ # 获取商品类别 categories = get_categories() # 模板内容 context = { # 商品类别 'categories': categories, } # 获取模板 # template = loader.get_template('list.html') template = loader.get_template(template_name) # 渲染模板内容 html_text = template.render(context) # 生成静态页面 file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, template_name) # 将渲染内容写入静态页面 with open(file_path, 'w') as f: # 写入数据 f.write(html_text)
def generate_detail_html(pk): if pk == 1 or pk == 2: return sku = SKU.objects.get(pk=pk) goods = sku.goods category = sku.goods.category1 channel = GoodsChannel.objects.get(category=category) goods.channel = channel sku_spec_set = sku.skuspecification_set.order_by('spec') sku_specs = [item.spec for item in sku_spec_set] sku_options = [item.option for item in sku_spec_set] skus = (goods.sku_set.order_by('id')) opts = list() for spec in sku_specs: all_opts = spec.specificationoption_set.order_by('id') opts.extend(all_opts) print(opts) print(skus) for spec in sku_specs: spec.options = spec.specificationoption_set.order_by('id') for index1, spec in enumerate(sku_specs): index = 1 for index2, option in enumerate(spec.options): if index1 == len(sku_specs) - 1: option.sku_id = skus[index1].id else: index += 0 if index1 == 0 else len(sku_specs[index2 - 1].options) spec.options[index2].sku_id = skus[index - 1].id # spec.options[1].sku_id = skus[len(sku_specs[0].options)-1 ] # spec.options[2].sku_id = skus[len(sku_specs[0].options)-1 + len(sku_specs[1].options)-1] # spec.options[3].sku_id = skus[len(sku_specs[0].options) + len(sku_specs[1].options) + len(sku_specs[2].options)] datas = { 'categories': get_categories(), 'goods': goods, 'sku': sku, 'specs': sku_specs } template_html = loader.get_template('detail.html') rendered_text = template_html.render(datas) templates_dir = os.path.join( os.path.dirname(os.path.dirname(settings.BASE_DIR)), 'font_end_pc/goods/') with open(os.path.join(templates_dir, '%s.html' % pk), 'w') as f: f.write(rendered_text) return datas
def generate_static_list_search_html(): """生成静态的商品列表页和搜索结果页html""" # 商品分类菜单 categories = get_categories() #渲染模板,生成静态html文件 context = { 'categories':categories, } template = loader.get_template('list.html') html_text = template.render(context) file_path = os.path.join(dev.GENERATED_STATIC_HTML_FILES_DIR, 'list.html') with open(file_path,'w') as f: f.write(html_text)
def generate_static_list_search_html(): """生成静态的商品列表页和搜索结果页html文件""" print('admin后台改动后自动调用generate_static_list_search_html()重新生成静态商品列表list(没有用到定时,位置:html.tasks)') # 商品分类菜单 categories = get_categories() # 渲染模板,生成静态html文件 context = { 'categories':categories, } template = loader.get_template('list.html') html_text = template.render(context) # 生成静态化的list.html file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,'list.html') with open(file_path,'w') as f: f.write(html_text)
def generate_static_sku_detail(sku_id): """ 生成静态商品详情页面 :param sku_id: 商品sku id """ # 商品分类菜单 categories = get_categories() # 获取当前SKU的详情信息 context = get_sku_detail(sku_id) # 渲染模板,生成静态html文件 context['categories'] = categories template = loader.get_template('detail.html') html_text = template.render(context) file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'goods/' + str(sku_id) + '.html') with open(file_path, 'w') as f: f.write(html_text)
def generate_static_sku_detail_html(sku_id): """ 生成静态详情页面 :param sku_id:商品sku_id """ # 商品分类菜单 categories = get_categories() # 获取当前的sku信息 sku = SKU.objects.get(id=sku_id) sku.image = sku.skuimage_set.all() # 面包屑导航信息中的频道 goods = sku.goods goods.channel = goods.category1.goodschannel_set.all()[0] # 构建当前商品的规格键 sku_specs = sku.skuspecification_set.order_by('spec_id') sku_key = [] for spec in sku_specs: sku_key.append(spec.option.id) # 获取当前商品的所有SKU skus = goods.sku_set.all() spec_sku_map = {} for s in skus: # 获取sku的规格参数 s_specs = s.skuspecification_set.order_by('spec_id') # 用于形成规格参数sku字典的键 key = [] for spec in s_specs: key.append(spec.option.id) # 向规格参数sku字典添加记录 spec_sku_map[tuple(key)] = s.id specs = goods.goodsspecification_set.order_by('id') # 若当前sku的规格信息不完整,则不再继续 if len(sku_key) < len(specs): return for index,spec in enumerate(specs): # 复制当前sku的规格信息 (复制列表中的所有元素,得到一个新的列表) key = sku_key[:] # 该规格的选项 options = spec.specificationoption_set.all() for option in options: # 在规格参数sku字典中查找符合当前规格的sku key[index] = option.id option.sku_id = spec_sku_map.get(tuple(key)) spec.options = options # 渲染模板,生成静态html文件 context = { 'categories':categories, 'goods':goods, 'specs':specs, 'sku':sku } template = loader.get_template('detail.html') html_text = template.render(context) file_path = os.path.join(dev.GENERATED_STATIC_HTML_FILES_DIR,'goods/'+str(sku_id)+'.html') with open(file_path,'w') as f: f.write(html_text)
def generate_static_sku_detail_html(sku_id): """生成商品详情静态页面<br> 此函数是通过点击[sku]{具体商品}进入的, 但是展示的数据其实是[spu]{商品}的数据, 所以需要通过[sku]获取对应的[spu]数据, 然后获取[spu]的所有规格数据, 最后对比当前[sku]的规格数据, 页面进行高亮显示 :param sku_id: 商品sku id """ """ [sku] = 具体商品 [spu] = 商品 """ # 获取商品分类 categories = get_categories() # 获取当前[sku]信息 sku = SKU.objects.get(id=sku_id) # 获取[sku]的所有图片 sku.images = sku.skuimage_set.all() # 获取当前[sku]的[spu]信息 goods = sku.goods # 获取商品频道 -- 根据商品类别 [一级类别 才对应有频道] goods.channel = goods.category1.goodschannel_set.all()[0] # 获取当前[sku]的规格信息 -- 排序规格ID sku_specs = sku.skuspecification_set.order_by('spec_id') # 封装当前[sku]的规格选项 sku_key = [] # 循环当前[sku]规格信息 -- [获取当前[sku]的所有规格选项] for spec in sku_specs: # 添加规格选项ID sku_key.append(spec.option.id) # 获取当前[spu]的所有[sku] skus = goods.sku_set.all() # 封装所有[sku]的规格信息字典 # -- k: [sku]的所有规格选项, v: 是哪个[sku] spec_sku_map = {} # 循环当前[spu]的所有[sku] # -- [获取[spu]的所有[sku]的规格信息, 因为需要通过[sku]获取对应规格信息] for s in skus: # 获取[sku]的规格信息 s_specs = s.skuspecification_set.order_by('spec_id') # 封装所有[sku]的规格选项字典key key = [] # 循环[sku]的规格信息 for spec in s_specs: # 添加当前[sku]规格信息的规格选项 key.append(spec.option.id) # tuple转为元组, 元组不可修改 # 添加当前[sku]的所有规格选项 spec_sku_map[tuple(key)] = s.id # 获取当前[spu]商品规格 -- 排序规格ID specs = goods.goodsspecification_set.order_by('id') # 若当前[sku]的规格信息不完整, 则不再继续 if len(sku_key) < len(specs): return # enumerate: 将可迭代对象添加索引 # 循环当前[spu]商品规格 -- [对比所有[sku]规格信息] for index, spec in enumerate(specs): # 复制当前[sku]的规格选项 (复制列表中的所有元素, 得到一个新的列表, :表示切片操作) key = sku_key[:] # 获取当前商品规格的所有规格选项 options = spec.specificationoption_set.all() # 循环规格选项 -- 设置当前规格选项指向哪个[sku] for option in options: # 设置当前规格选项ID key[index] = option.id # 设置当前规格选项的sku -- 对比所有sku的规格选项, 没有则为None option.sku_id = spec_sku_map.get(tuple(key)) # 设置当前商品规格指向哪个规格选项 spec.options = options # 封装页面内容, 渲染模板, 生成静态html文件 context = { # 商品类别 'categories': categories, # 商品, 当前[sku]的[spu] 'goods': goods, # 当前[sku]的[spu]所有规格 'specs': specs, # 当前[sku]的详情信息 'sku': sku } # 获取模板 template = loader.get_template('detail.html') # 渲染模板内容 html_text = template.render(context) # 生成静态页面 file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'goods/' + str(sku_id) + '.html') # 将渲染内容写入静态页面 with open(file_path, 'w') as f: # 写入数据 f.write(html_text)
def generate_static_sku_detail_html(sku_id): ''' 生成静态商品详情页面 :param sku_id: 商品sku id :return: ''' # 商品分类菜单 categories = get_categories() #获取当前sku的信息 sku = SKU.objects.get(id=sku_id) sku.images = sku.skuimage_set.all() #面包屑导航信息中频道 goods = sku.goods # 根据 商品类别 查询所属的频道 goods.channel = goods.category1.goodschannel_set.all()[0] # 构建当前商品的规格键 # sku_key = [规格1参数id, 规格2参数id, 规格3参数id, ...] sku_specs = sku.skuspecification_set.order_by('spec_id') sku_key = [] for spec in sku_specs: sku_key.append(spec.option.id) # 获取当前商品的所有SKU skus = goods.sku_set.all() # 构建不同规格参数(选项)的sku字典 # spec_sku_map = { # (规格1参数id, 规格2参数id, 规格3参数id, ...): sku_id, # (规格1参数id, 规格2参数id, 规格3参数id, ...): sku_id, # ... # } spec_sku_map = {} for s in skus: # 获取sku的规格参数 s_specs = s.skuspecification_set.order_by('spec_id') # 用于形成规格参数sku字典的键 key = [] for spec in s_specs: key.append(spec.option.id) # 向规格参数sku字典添加记录 spec_sku_map[tuple(key)] = s.id # 获取当前商品的规格信息: sku_id = 1 macbook电脑 # specs = [ # { # 'name': '屏幕尺寸', # 'options': [ # {'value': '13.3寸', 'sku_id': 1 }, # {'value': '15.4寸', 'sku_id': 2 }, # ] # }, # { # 'name': '颜色', # 'options': [ # {'value': '银色', 'sku_id': 1 }, # {'value': '黑色', 'sku_id': None } # ] # }, # { # 'name': '版本', # 'options': [ # {'value': '256G存储', 'sku_id': None }, # {'value': '128G存储', 'sku_id': None }, # {'value': '512G存储', 'sku_id': 1 } # ] # }, # ] specs = goods.goodsspecification_set.order_by('id') # 若当前sku的规格信息不完整,则不再继续 if len(sku_key) < len(specs): return for index, spec in enumerate(specs): # 复制当前sku的规格信息 (复制列表中的所有元素,得到一个新的列表, :表示切片操作) key = sku_key[:] # 该规格的选项 options = spec.specificationoption_set.all() for option in options: # 在规格参数sku字典中查找符合当前规格的sku key[index] = option.id option.sku_id = spec_sku_map.get(tuple(key)) spec.options = options # 渲染模板,生成静态html文件 context = { 'categories': categories, # 商品频道和类别数据 'goods': goods, # 当前商品所属的spu 'specs': specs, # 当前商品的规格信息 'sku': sku # 当前商品详情信息 } template = loader.get_template('detail.html') html_text = template.render(context) file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'goods/' + str(sku_id) + '.html') with open(file_path, 'w') as f: f.write(html_text)