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)
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)
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)
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)
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)
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)
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)