示例#1
0
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)
示例#2
0
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
示例#3
0
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)
示例#4
0
文件: tasks.py 项目: lmcxy/md_mall
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)
示例#5
0
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)
示例#6
0
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)
示例#7
0
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)
示例#8
0
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)