コード例 #1
0
    def get(self, request, category_id, page_num):
        page_num = int(page_num)

        try:
            # 获取三级类别模型对象
            category_model = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return render(request, '404.html')
        # 通过是否含有下级类别来判断是否为三级类别
        sub_cat = category_model.subs.all()
        if sub_cat:
            return render(request, '404.html')
        # 获取查询参数中的排序方式, 用户如果未指定则按照默认方式
        sort = request.GET.get('sort', 'default')

        # 按照价格字段排序
        if sort == 'price':
            sort_field = 'price'
        # 按照销量字段排序
        elif sort == 'hot':
            sort_field = '-sales'
        else:
            # 默认按照创建时间排序
            sort_field = 'create_time'
        # 每页展示的商品数量
        page = 5
        # 获取当前三级类别下的所有sku查询集
        sku_qs = category_model.sku_set.filter(
            category=category_model, is_launched=True).order_by(sort_field)
        # 当前三级类别下的所有sku数量
        sku_num = sku_qs.count()
        # 分页展示的页面总数量
        # total_page = sku_num // page + 1 if sku_num % page else 0
        # page_sku = sku_qs[0:5]
        # page_sku = sku_qs[5:10]
        # page_sku = sku_qs[10:15]
        # 利用切片获取当前页面要展示的sku
        # page_sku = sku_qs[(page_num-1) * page: page*page_num]

        # 创建分页器对象
        paginator = Paginator(sku_qs, page)
        try:
            # 分页器筛选当前页面要展示的sku
            page_sku = paginator.page(page_num)
        except EmptyPage:
            return HttpResponseForbidden('empty page')

        # 分页展示的页面总数量
        total_page = paginator.num_pages

        context = {
            'categories': get_category(),  # 频道分类
            'breadcrumb': get_bread_crumb(category_model),  # 面包屑导航
            'category': category_model,  # 三级类别模型
            'page_skus': page_sku,  # 分页后商品sku
            'page_num': page_num,  # 当前页码
            'total_page': total_page,  # 总页数
            'sort': sort,  # 排序方式
        }
        return render(request, 'list.html', context)
コード例 #2
0
 def get(self, request):
     '''
     首页
     :param request:
     :return:
     '''
     #获取商品分类
     # get_static_page()
     goods = get_category()
     obj = ContentCategory.objects.all()
     contents = {}
     for cc in obj:  #一级标题
         ct_obj = cc.content_set.all()
         for content_obj in ct_obj:  #二级标题
             cc_title = cc.title
             title = content_obj.title
             price = content_obj.price
             discountprice = content_obj.discountprice
             image = content_obj.image
             ad_id = cc.adCategory_id
             ad_obj = AdCategory.objects.get(id=ad_id)
             ad_title = ad_obj.title
             get_data(cc_title, title, price, discountprice, image)
     #获取广告商品信息
     get_contents(contents)
     #上下文
     context = {'goods': goods, "contents": contents}
     #响应前端界面
     return render(request, 'index.html', context)
コード例 #3
0
ファイル: pageStatic.py プロジェクト: lTimej/Time_mall
def get_static_page():
    #获取分类
    goods = get_category()
    obj = ContentCategory.objects.all()
    contents = {}
    for cc in obj:  # 一级标题
        ct_obj = cc.content_set.all()
        for content_obj in ct_obj:  # 二级标题
            cc_title = cc.title
            title = content_obj.title
            price = content_obj.price
            discountprice = content_obj.discountprice
            image = content_obj.image
            ad_id = cc.adCategory_id
            ad_obj = AdCategory.objects.get(id=ad_id)
            ad_title = ad_obj.title
            get_data(cc_title, title, price, discountprice, image)
    # 获取广告商品信息
    get_contents(contents)
    # 上下文
    print(goods, contents)
    context = {'goods': goods, "contents": contents}

    # 渲染模板
    # 先获取模板文件
    template = loader.get_template('index.html')
    # 在使用上下文渲染模板文件
    html_text = template.render(context)

    # 将模板文件写入到静态路径
    file_path = os.path.join(settings.STATICFILES_DIRS[0], 'index.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
コード例 #4
0
 def get(self, request, category_id):
     page = request.GET.get('page')
     per_page_num = constants.GOODS_LIST_LIMIT
     if not page:
         page = 1
     sort = request.GET.get('sort', 'default')
     p_r = request.GET.get("p_r", '')
     #排序后数据
     skus_list = get_spu(category_id, sort, p_r)
     #面包屑
     breadcrums = get_goods_category(category_id)
     #分类器
     try:
         sku_dict, total_page = get_pagination_data(skus_list, page,
                                                    per_page_num)
         content = {
             'spus_dict': sku_dict,
             'goods': get_category(),
             "breadcrums": breadcrums,
             "page_num": page,
             "total_page": total_page,
             "sort": sort,
             "category_id": category_id,
             "p_r": p_r
         }
     except:
         return http.HttpResponseForbidden("商品类别不存在")
     return render(request, "list.html", content)
コード例 #5
0
    def get(self, request, sku_id):
        try:
            sku_model = SKU.objects.get(id=sku_id, is_launched=True)
        except SKU.DoesNotExist:
            return HttpResponseForbidden("参数错误")

        category_model = sku_model.category

        spu = sku_model.spu
        """1.准备当前商品的规格选项列表 [8, 11]"""
        # 获取出当前正显示的sku商品的规格选项id列表
        current_sku_spec_qs = sku_model.specs.order_by('spec_id')
        current_sku_option_ids = []  # [8, 11]
        for current_sku_spec in current_sku_spec_qs:
            current_sku_option_ids.append(current_sku_spec.option_id)
        """2.构造规格选择仓库
        {(8, 11): 3, (8, 12): 4, (9, 11): 5, (9, 12): 6, (10, 11): 7, (10, 12): 8}
        """
        # 构造规格选择仓库
        temp_sku_qs = spu.sku_set.all()  # 获取当前spu下的所有sku
        # 选项仓库大字典
        spec_sku_map = {
        }  # {(8, 11): 3, (8, 12): 4, (9, 11): 5, (9, 12): 6, (10, 11): 7, (10, 12): 8}
        for temp_sku in temp_sku_qs:
            # 查询每一个sku的规格数据
            temp_spec_qs = temp_sku.specs.order_by('spec_id')
            temp_sku_option_ids = []  # 用来包装每个sku的选项值
            for temp_spec in temp_spec_qs:
                temp_sku_option_ids.append(temp_spec.option_id)
            spec_sku_map[tuple(temp_sku_option_ids)] = temp_sku.id
        """3.组合 并找到sku_id 绑定"""
        spu_spec_qs = spu.specs.order_by('id')  # 获取当前spu中的所有规格

        for index, spec in enumerate(spu_spec_qs):  # 遍历当前所有的规格
            spec_option_qs = spec.options.all()  # 获取当前规格中的所有选项
            temp_option_ids = current_sku_option_ids[:]  # 复制一个新的当前显示商品的规格选项列表
            for option in spec_option_qs:  # 遍历当前规格下的所有选项
                temp_option_ids[index] = option.id  # [8, 12]
                option.sku_id = spec_sku_map.get(
                    tuple(temp_option_ids))  # 给每个选项对象绑定下他sku_id属性

            spec.spec_options = spec_option_qs  # 把规格下的所有选项绑定到规格对象的spec_options属性上

        # 查询sku关联的所有商品订单信息
        order_goods = sku_model.ordergoods_set.filter(
            is_commented=True).order_by('-create_time')

        context = {
            'categories': get_category(),
            'breadcrumb': get_bread_crumb(category_model),
            'sku': sku_model,
            'spu': spu,
            'order_goods': order_goods,
            'category': category_model,
            'spec_qs': spu_spec_qs,  # 当前商品的所有规格数据
        }
        return render(request, 'detail.html', context)
コード例 #6
0
    def get(self, request, sku_id):
        """

        :param sku_id:
        :return:
        """
        # 验证sku_id
        try:
            sku = SKU.objects.get(id=sku_id)
        except Exception as e:
            return render(request, "404.html")


        # 商品分类
        categories = get_category()
        # 面包屑
        breadcrumb = get_breadcrumb(sku.category)
        # 热销排行

        # 构建当前商品的规格键  当前sku id为1的默认的规格
        sku_specs = SKUSpecification.objects.filter(sku__id=sku_id).order_by('spec_id')
        sku_key = []
        for spec in sku_specs:
            sku_key.append(spec.option.id)
        # [1, 4, 7]
        # print(sku_key)

        # 获取当前商品的所有SKU
        spu_id = sku.spu_id
        skus = SKU.objects.filter(spu_id=spu_id)

        # 构建不同规格参数(选项)的sku字典
        spec_sku_map = {}
        for s in skus:
            # 获取sku的规格参数
            s_specs = s.specs.order_by('spec_id')

            # 用于形成规格参数-sku字典的键
            key = []
            for spec in s_specs:
                key.append(spec.option.id)
            # 向规格参数-sku字典添加记录
            spec_sku_map[tuple(key)] = s.id
        # print(spec_sku_map)

        # 获取当前商品的规格信息
        goods_specs = SPUSpecification.objects.filter(spu_id=spu_id).order_by('id')
        # print(goods_specs)
        # 若当前sku的规格信息不完整,则不再继续
        # if len(sku_key) < len(goods_specs):
        #     return

        for index, spec in enumerate(goods_specs):
            # print(index, spec)
            # 复制当前sku的规格键
            key = sku_key[:]
            # 该规格的选项
            spec_options = spec.options.all()
            for option in spec_options:
                # 在规格参数sku字典中查找符合当前规格的sku
                key[index] = option.id
                # [1,4,7]
                option.sku_id = spec_sku_map.get(tuple(key))
            spec.spec_options = spec_options

        context = {
            "categories": categories,
            "breadcrumb": breadcrumb,
            "sku": sku,
            'specs': goods_specs
        }

        return render(request, "detail.html", context=context)
コード例 #7
0
    def get(self, request, category_id, page_num):
        """

        :param request:
        :param category_id:
        :param page_num:
        :return:
        """
        # category_id先校验此参数
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return http.HttpResponseForbidden("参数category_id不存在")

        sort = request.GET.get('sort', 'default')
        if sort == "price":
            sort_field = "price"
        elif sort == "hot":
            sort_field = "sales"
        else:
            sort = 'default'
            sort_field = 'create_time'
        categories = get_category()

        breadcrumb = get_breadcrumb(category)
        # 一级
        # if category.parent is None:
        #     breadcrumb["cat1"] = category
        # elif GoodsCategory.objects.filter(parent_id=category.id).count() == 0:
        #     # 三级
        #     breadcrumb["cat1"] = category.parent.parent
        #     breadcrumb["cat2"] = category.parent
        #     breadcrumb["cat3"] = category
        # else:
        #     # 二级
        #     breadcrumb["cat1"] = category.parent
        #     breadcrumb["cat2"] = category
        # print(breadcrumb)
        # 查询面包屑
        # breadcrumb = {
        #     'cat1': category.parent.parent,
        #     'cat2': category.parent,
        #     'cat3': category,
        # }
        # 分页和排序
        skus = SKU.objects.filter(is_launched=True,
                                  category_id=category.id).order_by(sort_field)
        # print(skus)
        # Paginator("要分页的数据", "每页的条数")
        pageinator = Paginator(skus, 5)
        try:
            # 获取要看的那一页数据  page_num
            page_skus = pageinator.page(page_num)
        except Exception as e:
            return http.HttpResponseNotFound("empty page")
        # 总页数
        total_page = pageinator.num_pages
        context = {
            'categories': categories,
            "breadcrumb": breadcrumb,
            "page_skus": page_skus,
            "total_page": total_page,
            "sort": sort,
            "category_id": category_id,
            "page_num": page_num,
                    }

        return render(request, 'list.html', context=context)