def generate_index_html(): """生成静态的主页html文件""" """查询分类数据""" categories = get_goods_category() """查询广告数据""" contents = {} content_categories = ContentCategory.objects.all() for category in content_categories: # 拿到广告类别下所有启用的广告,并排序 contents[category.key] = category.content_set.filter( status=True).order_by("sequence") # 生成html标签,写入html文件中 """生成html字符串""" # render(request, template_name, context) response = render(None, 'index.html', { 'categories': categories, 'contents': contents }) html_str = response.content.decode() """写文件""" file_name = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'index.html') with open(file_name, 'w', encoding='utf-8') as f: f.write(html_str) print('OK')
def generate_static_index_html(): # 封装了获取商品分类的函数在utils那边 categories = get_goods_category() # 2.广告数据 # 所有广告 contents = {} # 所有广告分类 content_categories = ContentCategory.objects.all() # 遍历所有广告分类 for category in content_categories: # 以每个分类的key作为键,分类下所有的广告内容作为值添加到广告的列表 contents[category.key] = category.content_set.filter( status=True).order_by('sequence') # 生成index.html response = render(None, 'index.html', { 'categories': categories, 'contents': contents }) html_str = response.content.decode() # 写文件 filename = os.path.join(settings.GENERATE_STATIC_HTML_PATH, 'index.html') # 生成文件的路径和名称 with open(filename, 'w', encoding='utf-8') as f: f.write(html_str) print('OK')
def generate_index_html(): categories = get_goods_category() # 1.2查询广告数据 contents = {} content_categories = ContentCategory.objects.all() for category in content_categories: contents[category.key] = category.content_set.filter(status=True).order_by('sequence') # 2.生成html标签,写到html文件中 # 2.1生成html字符串 response = render(None,'index.html',{'categories':categories,'contents':contents}) html_str = response.content.decode() #2.2写文件 filename = os.path.join(dev.GENERATE_STATIC_HTML_PATH,'index.html') # filename = settings.GENERATE_STATIC_HTML_PATH + '/index.html' # print(filename) with open(filename,'w',encoding='utf-8') as f: f.write(html_str) print('ok')
def generate_static_sku_detail_html(sku_id): """ 生成商品详情页的静态页面 :param sku_id: 商品的SKU id """ # 商品分类菜单 categories = get_goods_category() # 根据商品的sku_id获取当前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] # TODO ? # 构建当前函数的规格键的列表 # sku_key = [规格1参数id, 规格2参数id, 规格3参数id, ...] # 获取SKU具体规格数据 sku_specs = sku.skuspecification_set.order_by('spec_id') sku_key = [] for spec in sku_specs: # 向列表中添加规格的键的id 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') # 拿到对应着每一个规格的id,作为键并放入列表 # 用于形成规格参数-sku字典的键 key = [] for spec in s_specs: key.append(spec.option.id) # 向规格参数-sku字典添加记录 spec_sku_map[tuple(key)] = s.id # 获取当前商品的规格信息 """ specs = [ { 'name': '屏幕尺寸', 'options': [ {'value': '13.3寸', 'sku_id': xxx}, {'value': '15.4寸', 'sku_id': xxx}, ] }, { 'name': '颜色', 'options': [ {'value': '银色', 'sku_id': xxx}, {'value': '黑色', 'sku_id': xxx} ] }, ... ] """ # 按照id排序获取商品规格 specs = goods.goodsspecification_set.order_by('id') # 若当前sku的规格信息不完整,则不再继续 if len(sku_key) < len(specs): # 如果规格键数小于规格数,则视为信息不完整 return for index, spec in enumerate(specs): # enumerate: 转化成键值对,键为索引1,2,... # 获取当前sku的所有规格键 key = sku_key[:] # 该规格的选项 options = spec.specificationoption_set.all() for option in options: # 根据option.id获取对应的规格键 key[index] = option.id # 根据规格键,在规格参数sku字典中查找符合当前规格的sku option.sku_id = spec_sku_map.get(tuple(key)) # 设置规格的选项 spec.options = options # 渲染模板, 生成静态html文件 context = { 'categories': categories, 'goods': goods, 'specs': specs, 'sku': sku } # 生成html标签,写入html文件中 # 生成html字符串 # render(request, template_name, context) response = render(None, 'detail.html', context) html_str = response.content.decode() # 写文件 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_str)
def generate_static_sku_detail_html(sku_id): """ 生成静态商品详情页面 :param sku_id: 商品sku id """ # 商品分类菜单 categories = get_goods_category() # 获取当前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] print(goods.channel) # 构建当前商品的规格键 # sku_key = [规格1参数id, 规格2参数id, 规格3参数id, ...] # 所有规格加上参数id的列表 sku_specs = sku.skuspecification_set.order_by( 'spec_id') # 这个表里面存的是具体规格选项的id # <QuerySet [<SKUSpecification: 16: 华为 HUAWEI P10: 颜色 - 曜石黑>, <SKUSpecification: 16: 华为 HUAWEI P10: 版本 - 128GB>]> sku_key = [] # 这里面放的是当前SKU每个规格的选项参数的id for spec in sku_specs: # 遍历每一个规格 sku_key.append(spec.option.id) # 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 = {} # 构建一个sku对应其所有规格参数id的列表 # 取出当前商品的每一个sku 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 = [ # { # 'name': '屏幕尺寸', # 'options': [ # {1'value': '13.3寸', 'sku_id': xxx}, # {2'value': '15.6寸', 'sku_id': xxx} # ] # }, # { # 'name': '颜色', # 'options': [ # {1'value': '银色', 'sku_id': xxx}, # {2'value': '黑色', 'sku_id': xxx} # ] # }, # ... # ] # 所有规格信息,只是规格,例如颜色,内存,尺寸这种 specs = goods.goodsspecification_set.order_by('id') # 现在可以有两个规格,也可以有三个规格 # 若当前sku的规格信息不完整,则不再继续 # 就是判断一下这个商品里面的所有规格是否和sku的规格参数的数量是否相同, if len(sku_key) < len(specs): return # 遍历当前商品的每一个规格 原理是给当前商品的每个sku的所有规格上面的所有选项加上对应的sku_id属性 for index, spec in enumerate(specs): # 复制当前sku的规格键 key = sku_key[:] # [规格选项的id,规格选项的id,...] # 该规格的选项 # 查询每一个规格所有的选项 只是一个列表 options = spec.specificationoption_set.all() # 遍历每一个规格选项 for option in options: # 给每一个规格选项加[sku_id,sku_id,sku_id...],如果没有sku那就加不了,那前端就是else了,就不能点也不会高亮 # 在规格参数sku字典中查找符合当前规格的sku # 每变换一个规格的一个选项都表示换了一个具体的sku,不是一开始我们查到的那个了 这样就好理解了 key[index] = option.id # 就是每更换一个选项就查询有没有符合的sku,如果有就给这个选项加一个sku_id # 如果这个key可以取到,代表有一个存在的sku,赋值给这个选项的sku_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') response = render(None, 'detail.html', context=context) # html_text = template.render(context) html_str = response.content.decode() file_path = os.path.join(settings.GENERATE_STATIC_HTML_PATH, 'goods/' + str(sku_id) + '.html') with open(file_path, 'w', encoding='utf-8') as f: f.write(html_str) print('OK')
def generate_static_sku_detail_html(sku_id): """ 生成静态商品详情页面 :param sku_id: 商品sku_id :return: """ # 商品分类菜单 categories = get_goods_category() # 获取当前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 # 获取当前商品的规格信息 # specs = [ # { # 'name': '屏幕尺寸', # 'options': [ # {'value': '13.3寸', 'sku_id': xxx}, # {'value': '15.4寸', 'sku_id': xxx}, # ] # }, # { # 'name': '颜色', # 'options': [ # {'value': '银色', 'sku_id': xxx}, # {'value': '黑色', 'sku_id': xxx} # ] # }, # ... # ] specs = goods.goodsspecification_set.order_by('id') # 若当前skud的规格信息不完整, 则不再继续 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(settings.GENERATE_STATIC_HTML_PATH, 'goods/' + str(sku_id) + '.html') with open(file_path, 'w') as f: f.write(html_text)