Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
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())
Esempio n. 5
0
    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)