Esempio n. 1
0
    def get(self, request):
        """提供首页广告界面"""

        # 查询商品频道和分类
        categories = get_categories()

        # 定义一个空的字典
        dict = {}

        # 查询出所有的广告类别
        content_categories = ContentCategory.objects.all()
        # 遍历所有的广告类别, 然后放入到定义的空字典中:
        for cat in content_categories:
            # 获取类别所对应的展示数据, 并对数据进行排序:
            # key:value  ==>  商品类别.key:具体的所有商品(排过序)
            dict[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

        # 拼接参数:
        context = {
            # 这是首页需要的一二级分类信息:
            'categories': categories,
            # 这是首页需要的能展示的三级信息:
            'contents': dict,
        }
        # 返回界面, 同时传入参数:
        return render(request, 'index.html', context=context)
Esempio n. 2
0
    def get(self, request, sku_id):
        """
        获取商品详情页
        :param request:
        :param sku_id:
        :return:
        """
        # 获取商品频道分类
        categories = get_categories()
        sku = SKU.objects.get(id=sku_id)
        category = sku.category
        # 获取商品sku规格
        data = get_goods_and_spec(sku_id, request)

        # 根据商品类别id获取商品导航页
        breadcrumb = get_breadcrumb(category)
        # 组合参数
        context = {
            'categories': categories,
            'goods': data.get('goods'),
            'sku': data.get('sku'),
            'specs': data.get('goods_specs'),
            'breadcrumb': breadcrumb,
        }
        # 进行返回
        return render(request, 'detail.html', context=context)
Esempio n. 3
0
    def get(self, request, sku_id):
        """提供商品详情页"""
        # 商品分类菜单
        categories = get_categories()
        try:
            sku = SKU.objects.get(id=sku_id)
            sku.images = sku.skuimage_set.all()
        except SKU.DoesNotExist:
            return render(request, '404.html')

        # 面包屑导航
        category = sku.category
        breadcrumb = get_breadcrumb(category)
        # 调用封装的函数, 根据 sku_id 获取对应的
        # 1. 类别( sku )
        # 2. 商品( goods )
        # 3. 商品规格( spec )
        data = get_goods_and_spec(sku_id, request)

        # 拼接参数,生成静态 html 文件
        context = {
            'categories': categories,
            'goods': data.get('goods'),
            'specs': data.get('goods_specs'),
            'sku': data.get('sku'),
            'breadcrumb': breadcrumb,
        }

        return render(request, 'detail.html', context)
Esempio n. 4
0
def generate_static_sku_detail_html(sku_id):
    """生成商品详情页的静态页面"""
    # 生成商品分类
    categories = get_categories()

    sku = SKU.objects.get(id=sku_id)
    # 获取导航栏的数据,面包屑
    goods = sku.goods
    goods.channel = goods.category1.goodschannel_set.all()[0]
    # 获取商品规格的参数id(红/白,7p/13p)
    sku_specs = sku.skuspecification_set.order_by('spec_id')
    sku_key = []
    for spec in sku_specs:
        # 取到规格相应的选项的内容参数id
        sku_key.append(spec.option.id)

    # 获取商品(spu)的全部规格(颜色,尺寸)
    skus = goods.sku_set.all()
    spec_sku_map = {}
    for s in skus:
        s_specs = s.skuspecification_set.order_by('spec_id')
        key = []
        for spec in s_specs:
            key.append(spec.option.id)
        spec_sku_map[tuple(key)] = s.id
    # {
    # 	([颜色,尺寸],): sku_1,
    # 	([],): sku_2,
    # }

    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(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'goods/' + str(sku_id) + '.html')
    with open(file_path, 'w') as f:
        f.write(html_text)
Esempio n. 5
0
    def get(self, request):
        """提供首页广告界面"""

        # 查询商品频道和分类
        categories = get_categories()

        # 定义一个空的字典
        dict = {}

        # 查询出所有的广告类别
        content_categories = ContentCategory.objects.all()
        # 遍历所有的广告类别, 然后放入到定义的空字典中:
        for cat in content_categories:
            # 获取类别所对应的展示数据, 并对数据进行排序:
            # key:value  ==>  商品类别.key:具体的所有商品(排过序)
            dict[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

        # 拼接参数:
        context = {
            # 这是首页需要的一二级分类信息:
            'categories': categories,
            # 这是首页需要的能展示的三级信息:
            'contents': dict,
        }
        # 返回界面, 同时传入参数:
        return render(request, 'index.html', context=context)
Esempio n. 6
0
def generate_static_index_html():
    '''
    把首页生成静态页面
    :return:
    '''
    # 商品分类数据:
    categories = get_categories()

    # 1.广告内容
    # 2.获取所有的广告类别
    content_categories = ContentCategory.objects.all()

    dict = {}
    # 3.遍历所有的广告类别, 获取每一个
    for cat in content_categories:
        # 4.定义一个字典, 把广告类别对应的内容放到字典中
        dict[cat.key] = cat.content_set.filter(
            status=True).order_by('sequence')

    # 5.拼接参数
    context = {'categories': categories, 'contents': dict}
    # 6.返回
    # return render(request, 'index.html', context)
    # 获取首页模板文件
    template = loader.get_template('index.html')
    # 渲染首页html字符串
    html_text = template.render(context)
    # 将首页html字符串写入到指定目录,命名'index.html'
    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)
Esempio n. 7
0
    def get(self, request, sku_id):
        '''
        根据sku_id 获取对应的商品, 整理格式, 返回
        :param request:
        :param sku_id:
        :return:
        '''
        # 1.根据sku_id 获取对应的商品
        data = get_goods_and_spec(sku_id, request)

        # 3.获取商品分类
        categories = get_categories()

        breadcrumb = get_breadcrumb(data.get('goods').category3)

        # 4.整理格式
        context = {
                'categories': categories,
                'sku': data.get('sku'),
                'goods': data.get('goods'),
                'specs': data.get('goods_specs'),
                'breadcrumb': breadcrumb
        }

        # 5.返回
        return render(request, 'detail.html', context)
Esempio n. 8
0
def generate_static_index_html():
    """生成静态的主页html文件"""

    # 直接把静态页面的代码复制过来

    # 获取商品频道及类别
    categories = get_categories()
    # 获取所有首页广告类别
    contents = ContentCategory.objects.all()
    content = dict()
    # 遍历所有的广告获取所有类别对应的广告的信息(定义一个字典,存放广告类别的key对应的value是此条广告类别所有的广告的对象)
    for con in contents:
        content[con.key] = con.content_set.filter(
            status=True).order_by('sequence')
    #
    context = {'categories': categories, 'contents': content}

    # return render(request, 'index.html', context=context)
    # 分开进行返回,写入到文件中
    # 获取首页模板文件
    template = loader.get_template('index.html')
    # 渲染首页html字符串
    html_text = template.render(context)
    # 将首页html字符串写入到指定目录,命名'index.html'
    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)
Esempio n. 9
0
    def get(self, request):
        '''
        返回首页页面
        :param request:
        :return:
        '''
        # 商品分类数据:
        categories = get_categories()

        # 1.广告内容
        # 2.获取所有的广告类别
        content_categories = ContentCategory.objects.all()

        dict = {}
        # 3.遍历所有的广告类别, 获取每一个
        for cat in content_categories:

            # 4.定义一个字典, 把广告类别对应的内容放到字典中
            dict[cat.key] = cat.content_set.filter(
                status=True).order_by('sequence')

        # 5.拼接参数
        context = {'categories': categories, 'contents': dict}
        # 6.返回
        return render(request, 'index.html', context)
Esempio n. 10
0
def generate_static_sku_detail_html(sku_id):
    """
    生成静态商品详情页面
    :param sku_id: 商品id值
    """
    # 商品分类菜单
    dict = get_categories()

    goods, specs, sku = get_goods_and_spec(sku_id)

    # 渲染模板,生成静态html文件
    context = {
        'categories': dict,
        'goods': goods,
        'specs': specs,
        'sku': sku
    }

    # 加载 loader 的 get_template 函数, 获取对应的 detail 模板
    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)
Esempio n. 11
0
def generate_static_index_html():
    #==========提取类别频道数据===========
    categories = get_categories()

    #==========提取首页广告数据===========
    #定义一个字典来存储广告内容部分
    contents = {}
    #从广告类别模型类中获取所有数据,存放到变量中:
    content_categories = ContentCategory.objects.all()
    #遍历每一个广告类别, 把对应的广告内容添加到contents字典里
    for cat in content_categories:
        #例如: 滚动广告里有xxx这三个广告内容
        contents[cat.key]=Content.objects.filter(category=cat,status=True).order_by('sequence')
    # 把类别频道数据和广告内容数据整合到一个新字典里
    context = {'categories': categories, 'contents': contents}

    #==========提取template模板=========
    #根据导入的loader获取'index.html'模板
    template = loader.get_template('index.html')
    #==========生成新的静态化页面给前端====
    # 将context渲染到模板中, 生成渲染过的模板
    html_text = template.render(context)
    #我们拼接新的index.html模板将要生成的所在地地址:
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,'index.html')
    #以写的权限,将渲染过的模板重新生成,写入到文件中
    with open(file_path,'w',encoding='utf-8') as f:
        f.write(html_text)
Esempio n. 12
0
def generate_static_sku_detail_html(sku_id):

    # 分组频道参数
    categories = get_categories()

    goods, sku, specs = get_goods_and_spec(sku_id)

    # =================模版渲染===================
    # 构建模版参数
    context = {
        'categories': categories,  # 用于构建详情页面商品频道
        'goods': goods,  # 当前sku商品的spu商品(Goods模型类)
        'sku': sku,
        'specs': specs  # 传入的是当前sku商品从属的spu拥有的规格及其选项
    }

    # 获取模版
    template = loader.get_template('detail.html')
    # 调用模版渲染函数,得出完整的html页面
    sku_html_text = template.render(context=context)
    # 写入静态文件
    file_path = os.path.join(
        settings.GENERATED_STATIC_HTML_DIR,
        'goods/' + str(sku_id) + '.html'  # goods/16.html
    )
    with open(file_path, 'w') as f:
        f.write(sku_html_text)
Esempio n. 13
0
def generate_static_index_html():
    """
    生成静态的主页html文件
    """
    print('%s: generate_static_index_html' % time.ctime())
    # 获取商品频道和分类
    categories = get_categories()

    # 广告内容
    contents = {}
    content_categories = ContentCategory.objects.all()
    for cat in content_categories:
        contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

    # 渲染模板
    context = {
        'categories': categories,
        'contents': contents
    }

    # 获取首页模板文件
    template = loader.get_template('index.html')
    # 渲染首页html字符串
    html_text = template.render(context)
    # 将首页html字符串写入到指定目录,命名'index.html'
    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)
Esempio n. 14
0
def generate_static_index_html():
    categories = get_categories()

    # =====================生成首页广告部分数据=======================
    # 我们定义一个字典, 里面将要存储广告内容部分:
    contents = {}
    # 从 ContentCategory 模型类中获取所有数据, 存放到 content_categories 中:
    content_categories = ContentCategory.objects.all()
    # 遍历刚刚获取的所有数据: 拿到每一个广告分类 cat:
    for cat in content_categories:
        # 根据广告分类的 外键反向
        # 获取广告内容中状态为 True 并且按 sequence 排序的部分,
        # 赋值给上面定义的字典, 快捷键(cat.key) 作为 key, 排序的部分作为value
        contents[cat.key] = Content.objects.filter(
            category=cat, status=True).order_by('sequence')

    # 第二部分: 模板渲染部分:
    # 把上面两部分获取的有序字典和字典作为变量,拼接新的字典 context
    context = {'categories': categories, 'contents': contents}

    # =====================获取模板,把数据添加进去生成页面====================
    # 根据导入的 loader 获取 'index.html' 模板
    template = loader.get_template('index.html')

    # 拿到模板, 然后将 context 渲染到模板中, 生成渲染过的模板
    html_text = template.render(context)

    # 我们拼接新的 index.html 模板将要生成的所在地地址:
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'index.html')
    print(time.time())

    # 以写的权限,将渲染过的模板重新生成, 写入到文件中.
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
Esempio n. 15
0
    def get(self, request):
        '''
        提供首页页面
        :param request:
        :return:
        '''
        # 1. 获取分类的三级数据
        categiries = get_categories()

        # 2. 获取所有的广告分类
        content_categories = ContentCategory.objects.all()

        # 5. 组织数据
        dict = {}

        # 3. 遍历所有的广告分类, 获取每一个分类
        for cat in content_categories:

            # 4. 根据分类获取广告内容(展示的)
            dict[cat.key] = cat.content_set.filter(
                status=True).order_by('sequence')

        context = {'categories': categiries, 'contents': dict}

        # 6. 返回
        return render(request, 'index.html', context=context)
Esempio n. 16
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)
    cat3 = sku.category
    cat2 = cat3.parent
    cat1 = cat2.parent
    cats = {
        'cat1': cat1,
        'cat2': cat2,
        'cat3': cat3,
    }
    # 渲染模板,生成静态html文件
    context = {'categories': categories, 'sku': sku, 'cats': cats}
    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', encoding='utf-8') as f:
        f.write(html_text)

    print(sku_id)
Esempio n. 17
0
    def get(self, request, category_id, page_num):
        """提供商品列表页"""
        # 判断category_id是否正确
        try:
            # 获取三级菜单分类信息
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return HttpResponseNotFound('GoodsCategory 不存在')

        # 查询商品频道分类
        categories = get_categories()

        # 查询面包屑导航
        breadcrumb = get_breadcrumb(category)


        # 接收sort参数:如果用户不传,就是默认的排序规则
        sort = request.GET.get('sort','defayle')

        # 按照排序规则查询该分类商品SKU信息
        if sort == 'price':
            sortkind = 'price'
        elif sort == 'hot':
            sortkind = '-sales'
        else:
            # 'price'和'sales'以外的所有排序方式都归为'default'
            sortkind = 'create_time'

        # 获取当前分类并且上架的商品(并且对商品按照排序字段进行排序)
        skus = SKU.objects.filter(category=category,is_launched=True).order_by(sortkind)

        # 创建分页器:每页N条记录
        # 列表页每页商品数据量
        # GOODS_LIST_LIMIT = 5
        paginator = Paginator(skus,5)

        try:
            # 分页后数据
            page_skus = paginator.page(page_num)
        except EmptyPage:
            # 如果page_num不正确,默认给用户404
            return HttpResponseNotFound('empty page')
        # 获取列表页总页数
        total_page = paginator.num_pages




        # 渲染页面
        context = {
            'categories':categories, # 频道分类
            'breadcrumb':breadcrumb, # 面包屑导航
            'sort': sort,  # 排序字段
            'category': category,  # 第三级分类
            'page_skus': page_skus,  # 分页后数据
            'total_page': total_page,  # 总页数
            'page_num': page_num,  # 当前页码
        }
        return render(request, 'list.html',context)
Esempio n. 18
0
def generate_static_index_html():
    """
    生成静态的主页html文件
    """
    print('%s: generate_static_index_html' % time.ctime())
    # 商品频道及分类菜单
    # 使用有序字典保存类别的顺序
    # categories = {
    #     1: { # 组1
    #         'channels': [{'id':, 'name':, 'url':},{}, {}...],
    #         'sub_cats': [{'id':, 'name':, 'sub_cats':[{},{}]}, {}, {}, ..]
    #     },
    #     2: { # 组2
    #
    #     }
    # }
    # categories = OrderedDict()
    # channels = GoodsChannel.objects.order_by('group_id', 'sequence')
    # for channel in channels:
    #     group_id = channel.group_id  # 当前组
    #
    #     if group_id not in categories:
    #         categories[group_id] = {'channels': [], 'sub_cats': []}
    #
    #     cat1 = channel.category  # 当前频道的类别
    #
    #     # 追加当前频道
    #     categories[group_id]['channels'].append({
    #         'id': cat1.id,
    #         'name': cat1.name,
    #         'url': channel.url
    #     })
    #     # 构建当前类别的子类别
    #     for cat2 in cat1.goodscategory_set.all():
    #         cat2.sub_cats = []
    #         for cat3 in cat2.goodscategory_set.all():
    #             cat2.sub_cats.append(cat3)
    #         categories[group_id]['sub_cats'].append(cat2)

    categories = get_categories()

    # 广告内容
    contents = {}
    content_categories = ContentCategory.objects.all()
    for cat in content_categories:
        contents[cat.key] = cat.content_set.filter(
            status=True).order_by('sequence')
    # 渲染模板
    context = {'categories': categories, 'contents': contents}
    # 获取模板文件
    template = loader.get_template('index.html')
    # 根据数据渲染模板,返回生成的html字符串
    html_text = template.render(context)
    # 将字符串输出到index.html文件
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'index.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
Esempio n. 19
0
def generate_static_sku_detail_html(sku_id):
    """
    生成静态商品详情页面
    :param sku_id: 商品sku id
    """
    categories = get_categories()

    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_specs = sku.skuspecification_set.order_by('spec_id')
    sku_key = []
    for spec in sku_specs:
        sku_key.append(spec.option.id)

    skus = goods.sku_set.all()

    spec_sku_map = {}
    for s in skus:
        s_specs = s.skuspecification_set.order_by('spec_id')
        key = []

        for spec in s_specs:
            key.append((spec.option.id))

        spec_sku_map[tuple(key)] = s.id

        specs = goods.goodsspecification_set.order_by('id')

        if len(sku_key) < len(specs):
            return
        for index ,spec in enumerate(specs):
            key = sku_key[:]
            options = spec.specificationoption_set.all()

            for option in options:
                key[index] = option.id
                option.sku_id = spec_sku_map.get(tuple(key))

            spec.options = options

        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.GENERATED_STATIC_HTML_FILES_DIR,
                                 'goods/'+str(sku_id)+'.html')
        with open(file_path, 'w') as f:
            f.write(html_text)
Esempio n. 20
0
def generate_static_sku_detail_html(sku_id):
    try:
        sku = SKU.objects.get(id=sku_id)
    except SKU.DoesNotExist:
        return http.HttpResponseForbidden('sku_id不正确')
    # 商品分类
    categories = get_categories()
    # 面包屑
    breadcrumb = get_breadcrumb(sku.category)
    # 构建当前商品的规格键
    sku_specs = sku.specs.order_by('spec_id')
    sku_key = []
    for spec in sku_specs:
        sku_key.append(spec.option.id)
    # 获取当前商品的所有SKU
    skus = sku.spu.sku_set.all()
    # 构建不同规格参数(选项)的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
    # 获取当前商品的规格信息
    goods_specs = sku.spu.specs.order_by('id')
    # 若当前sku的规格信息不完整,则不再继续
    if len(sku_key) < len(goods_specs):
        return
    for index, spec in enumerate(goods_specs):
        # 复制当前sku的规格键
        key = sku_key[:]
        # 该规格的选项
        spec_options = spec.options.all()
        for option in spec_options:
            # 在规格参数sku字典中查找符合当前规格的sku
            key[index] = option.id
            option.sku_id = spec_sku_map.get(tuple(key))
        spec.spec_options = spec_options
    context = {
        'categories': categories,
        'breadcrumb': breadcrumb,
        'sku': sku,
        'specs': goods_specs,
    }
    template = loader.get_template('detail.html')
    html_text = template.render(context)
    file_path = os.path.join(settings.STATICFILES_DIRS[0],
                             'detail/' + str(sku_id) + '.html')
    with open(file_path, 'w') as f:
        f.write(html_text)
Esempio n. 21
0
def generate_static_list_search_html():
    """生成静态的商品列表页面"""
    #商品分类菜单
    categories = get_categories()
    #渲染模板,生成静态html文件
    context = {'categories': categories}
    template = loader.get_template('list.html')
    html_text = template.render(context)
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'list.html')
    with open(file_path, 'w') as f:
        f.write(html_text)
Esempio n. 22
0
    def get(self, request, category_id, page_num):
        """提供商品列表页"""
        try:
            # 获取三级菜单分类信息:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return http.HttpResponseNotFound('GoodsCategory 不存在')
        # 查询商品频道分类
        categories = get_categories()

        # 查询面包屑导航
        breadcrumb = get_breadcrumb(category)
        sort = request.GET.get('sort', 'default')
        # 按照排序规则查询该分类商品的sku信息
        if sort == 'price':
            # 按照价格由低到高
            sortkind = 'price'
        elif sort == 'hot':
            # 按照销量由高到低
            sortkind = '-sales'
        else:
            sort = 'default'
            sortkind = 'create_time'

        skus = SKU.objects.filter(category=category,
                                  is_launched=True).order_by(sortkind)

        # 创建分页器:每页N条记录
        # # 列表页每页商品数据量
        # GOODS_LIST_LIMIT = 5
        paginator = Paginator(skus, 5)
        # 获取每页商品的数据
        try:
            page_skus = paginator.page(page_num)

        except EmptyPage:
            # 如果page_num 不正确,默认给用户404
            return http.HttpResponseNotFound('empty page')

        # 获取列表的总页数
        total_page = paginator.num_pages

        # 渲染页面
        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sort': sort,  # 排序字段
            'category': category,  # 第三级分类
            'page_skus': page_skus,  # 分页后数据
            'total_page': total_page,  # 总页数
            'page_num': page_num,  # 当前页码
        }
        return render(request, 'list.html', context)
Esempio n. 23
0
def generate_static_index_html():
    """生成主页静态文件"""
    print('%s: generate_static_index_html' % time.ctime())
    # 定义有序字典变量: categories
    # 字典内容: 商品频道及分类菜单
    # 创建有序字典
    categories = get_categories()
    # 广告内容
    contents = {}
    # contents = {
    #     'index_lbt': [广告类型],
    #     'index_lbt': [广告类型],
    # }
    content_categories = ContentCategory.objects.all()
    for cat in content_categories:
        contents[cat.key] = cat.content_set.filter(
            status=True).order_by('sequence')

    # 图书广告
    advertise_categories = AdvertiseCategory.objects.all()
    advertises = []
    for cat in advertise_categories:
        advertise = {}
        advertise['cat'] = cat
        advertise['skus_cats'] = []
        advertise['skus'] = []
        for a in Advertise.objects.filter(category=cat):
            # advertise['skus'].append(a.sku)
            if a.sku.category not in advertise['skus_cats']:
                advertise['skus_cats'].append(a.sku.category)

        for cat in advertise['skus_cats']:
            advertise['skus'].append(
                SKU.objects.filter(category=cat,
                                   advertise__category=advertise['cat']))

        advertises.append(advertise)

    # 渲染渲染
    context = {
        'categories': categories,
        'contents': contents,
        'advertises': advertises
    }
    template = loader.get_template('index.html')
    html_text = template.render(context)

    # 主页静态文件存储路径
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'index.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
Esempio n. 24
0
    def get(self, request, category_id, page_num):
        """
        展示商品列表详情页
        :param request:
        :return:
        """
        # 获取参数
        sort = request.GET.get('sort', 'default')
        # 校验参数
        # 路由里面已经进行过正则匹配了
        # if not all([category_id, page_num]):
        #     return http.HttpResponseForbidden('缺少必传参数')
        try:
            # 根据商品id获取商品列表并排序
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return http.HttpResponseNotFound('GoodCategory 不存在')

        # 获取商品类别
        categories = get_categories()
        # 根据商品类别id获取商品导航页
        breadcrumb = get_breadcrumb(category)
        # 根据sort的内容确定排序的方式
        if sort == 'price':
            sort_kind = 'price'
        elif sort == 'hot':
            sort_kind = '-sales'
        else:
            sort_kind = 'create_time'

        sku_s = category.sku_set.filter(is_launched=True).order_by(sort_kind)
        # 创建分页对象
        paginator = Paginator(sku_s, 5)
        # 根据页数返回页面的数据
        try:
            content = paginator.page(page_num)
        except EmptyPage:
            return http.HttpResponseNotFound('页面不存在')
        # 返回总页数
        page_nums = paginator.num_pages
        # 拼接数据进行返回
        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sort': sort,
            'category': category,
            'page_skus': sku_s,
            'total_page': page_nums,
            'page_num': page_num
        }
        return render(request, 'list.html', context=context)
Esempio n. 25
0
 def get(self, request, category_id, page_num):
     """提供商品列表页"""
     # 1.校验category_id
     try:
         # 获取三级菜单分类信息
         category = GoodsCategory.objects.get(id=category_id)
     except GoodsCategory.DoesNotExist:
         return http.HttpResponseNotFound('GoodsCategory不存在')
     # 2.获取商品频道分类
     categories = get_categories()
     # 3.获取面包屑导航
     breadcrumb = get_breadcrumb(category)
     # 4.获取前端用查询字符串方式传来的sort参数,如没有,则取默认值default
     sort = request.GET.get('sort', 'default')
     # 5.判断排序方式,确认排序依据
     if sort == 'price':
         # 按照价格由低到高排序
         sortkind = 'price'
     elif sort == 'hot':
         # 按照销量由高到低排序
         sortkind = '-sales'
     else:
         sort = 'default'
         # 默认排序,按照创建时间排序
         sortkind = 'create_time'
     # 6.获取当前分类并且上架的商品,并对商品按照上面的排序方式进行排序
     skus = SKU.objects.filter(category=category, is_launched=True).order_by(sortkind)
     # 7.创建一个分页器对象,第一个参数为要展示的数据列表,第二个参数为每页的显示数量
     paginator = Paginator(skus, 5)
     # 8.获取对应页面的商品
     try:
         page_skus = paginator.page(page_num)
     # 如果只有四页数据,但是前端索求第五页的数据,则报错
     except EmptyPage:
         return http.HttpResponseNotFound('Empty Page')
     # 9.获取总页数
     total_page = paginator.num_pages
     # 10.拼接数据字典
     context = {
         'categories': categories,  # 频道分类
         'breadcrumb': breadcrumb,  # 面包屑导航
         'sort': sort,  # 排序字段
         'category': category,  # 第三级分类
         'page_skus': page_skus,  # 对应页面的商品
         'total_page': total_page,  # 总页数
         'page_num': page_num  # 当前页码
     }
     # 11.渲染页面
     return render(request, 'list.html', context)
Esempio n. 26
0
 def get(self, request, sku_id):
     """提供商品详情页"""
     # 获取商品频道分类
     categories = get_categories()
     # 调用封装的函数,根据sku_id获取对应的商品数据字典
     data = get_goods_and_spec(sku_id, request)
     # 拼接字典数据
     context = {
         'categories': categories,
         'sku': data.get('sku'),
         'goods': data.get('goods'),
         'specs': data.get('goods_specs'),
     }
     # 渲染页面
     return render(request, 'detail.html', context)
Esempio n. 27
0
def generate_static_list_search_html():
    """
    生成静态的商品列表页和搜索结果页html文件
    :return:
    """
    # 商品分类菜单
    categories = get_categories()

    # 渲染模板,生成静态文件
    context = {'categories': categories}

    template = loader.get_template('static_list.html')
    static_list_html = template.render(context)
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'list.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(static_list_html)
Esempio n. 28
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)

    with open(settings.LIST_FILE, 'w') as f:
        f.write(html_text)
Esempio n. 29
0
 def get(self, request, sku_id):
     """提供商品详情页"""
     # 1.获取当前sku的信息
     try:
         # 根据商品的sku_id获取对应的商品
         sku = SKU.objects.get(id=sku_id)
     except Exception as e:
         # 如果商品不存在,返回404
         return render(request, '404.html')
     # 2.查询商品频道分类
     categories = get_categories()
     # 3.渲染页面
     context = {
         'categories': categories,
         'sku': sku,
     }
     return render(request, 'detail.html', context)
Esempio n. 30
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)  # 渲染模板,返回渲染好的html字符串
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'list.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
Esempio n. 31
0
def generate_static_sku_detail_html(sku_id):
    template = loader.get_template('detail.html')

    categories = get_categories()
    goods, sku, specs = get_goods_and_spec(sku_id)
    context = {
        'categories': categories,
        'goods': goods,  # 当前sku从属的spu
        'specs': specs,  # 规格和选项信息
        'sku': sku  # 当前sku商品对象
    }

    html_text = template.render(context)

    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,
                             'goods/%s.html' % sku_id)
    with open(file_path, 'w') as f:
        f.write(html_text)
Esempio n. 32
0
    def get(self, request):
        """提供首页广告界面"""

        # 查询首页广告界面
        categories = get_categories()

        # 定义一个空的字典
        dict = {}
        # 查询出所有的广告类别
        content_categories = ContentCategory.objects.all()
        # 遍历所有的广告类别,然后放入到定义的空字典中
        for cat in content_categories:
            # 获取类别对应的展示数据, 并对数据进行排序
            dict[cat.key] = cat.content_set.filter(status=True).order_by('sequence')
        # 拼接参数
        context = {
            # 这是首页需要的一二级分类信息
            'categories': categories,
            # 这是首页需要的能展示的三级信息
            'contents': dict
        }

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