예제 #1
0
def generate_static_sku_detail_html(sku_id):
    """
    生成静态商品详情页面
    :param sku_id: 商品sku id
    """
    # 获取当前sku的信息
    sku = SKU.objects.get(id=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],
                             'html/detail/' + str(sku_id) + '.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)
예제 #2
0
 def get(self, request, sku_id):
     """提供商品详情页"""
     # 接收、校验参数
     try:
         # 查询商品sku信息
         sku = SKU.objects.get(id=sku_id)
     except SKU.DoesNotExist:
         return render(request, '404.html')
     # 查询商品分类
     categories = get_categories()
     # 查询面包屑导航
     breadcrumb = get_breadcrumb(sku.category)
     # 获取当前sku对应商品所有的规格(屏幕尺寸、颜色、内存)
     sku_specs = sku.specs.order_by('spec_id')
     # 记录当前sku对应商品的所有规格的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 ---> {(1, 4, 7): 1, (1, 3, 7): 2}
     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
     }
     return render(request, 'detail.html', context)
예제 #3
0
 def get(self, request, category_id, page_num):
     """查询并渲染商品列表页"""
     # 获取商品排序规则
     sort = request.GET.get('sort', 'default')
     # 根据sort选择排序字段
     if sort == 'price':  # 按照价格从低到高排序
         sort_field = 'price'
     elif sort == 'hot':  #
         sort_field = '-sales'  # 按照销量从高到低排序
     else:  # 其他情况视为 默认情况 'default'
         sort = 'default'  # sort 为其他值时,如 'comprehensive', 则设为 'default'
         sort_field = 'create_time'
     try:
         # 校验category_id,防止出现 category_id > 商品类别数量
         category = GoodsCategory.objects.get(
             id=category_id)  # category为三级类别
     except GoodsCategory.DoesNotExist:
         return http.HttpResponseForbidden('参数category_id错误')
     # 查询商品分类
     categories = get_categories()
     # 查询面包屑导航: 一级 -> 二级 ->三级
     breadcrumb = get_breadcrumb(category)
     # 分页查询和排序:category查询sku,一查多
     try:
         skus = category.sku_set.filter(
             is_launched=True).order_by(sort_field)
     except GoodsCategory.DoesNotExist:
         return http.HttpResponseForbidden('查询条件错误')
     # 创建分页器
     # Paginator('要分页的记录', '每页记录的条数')
     paginator = Paginator(
         skus, constants.RECORDS_NUM_PER_PAGE)  # 把skus进行分页,每页5条记录
     # 获取用户要看的那一个记录
     try:
         page_skus = paginator.page(page_num)  # 获取到page_num页中的5条记录
     # 如果用户输入的page_num是否超过总页数,捕获异常
     except EmptyPage:
         return http.HttpResponseNotFound('Empty Page')
     # 获取总页数,前端分页插件使用
     total_pages = paginator.num_pages
     # 构造上下文
     context = {
         'categories': categories,
         'breadcrumb': breadcrumb,
         'page_skus': page_skus,
         'total_pages': total_pages,
         'page_num': page_num,
         'sort': sort,
         'category_id': category_id,
     }
     return render(request, 'list.html', context)
예제 #4
0
 def get(self, request):
     """提供首页广告页面"""
     # 查询商品分类三级数据
     categories = get_categories()
     # 查询首页广告数据
     contents = OrderedDict()
     content_categories = ContentCategory.objects.all()
     for content_category in content_categories:
         # 使用广告类别查询处该类别对应的所有广告内容
         contents[
             content_category.key] = content_category.content_set.filter(
                 status=True).order_by('sequence')  # 查询出未下架的广告并排序
     # 构造上下文
     context = {'categories': categories, 'contents': contents}
     return render(request, 'index.html', context)
예제 #5
0
파일: crons.py 프로젝트: yi0506/meiduo
def generate_static_index_html():
    """首页静态化"""
    # 查询商品分类三级数据
    categories = get_categories()
    # 查询首页广告数据
    contents = OrderedDict()
    content_categories = ContentCategory.objects.all()
    for content_category in content_categories:
        # 使用广告类别查询处该类别对应的所有广告内容
        contents[content_category.key] = content_category.content_set.filter(
            status=True).order_by('sequence')  # 查询出未下架的广告并排序
    # 构造上下文
    context = {'categories': categories, 'contents': contents}
    # 渲染模板
    html_text = loader.render_to_string('index.html', context)
    file_path = os.path.join(settings.STATICFILES_DIRS[0], 'html/index.html')
    # 将模板文件写入静态路径
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)