一、商品列表页面分析
1、商品频道分类
-已经在“首页广告”"首页商品频道分类"中实现,将相关代码封装到contents.utils.py文件中,直接调用即可
2、面包屑导航
- 可以使用三级分类ID,查询出该类型商品的三级分类数据。
3、排序、商品展示、分页
- 无论如何排序和分页,商品的分类不能变。
- 排序时需要知道当前排序方式。
- 分页时需要知道当前分页的页码,且每页五条商品记录。
- 展示的商品都是属于该商品分类下的商品
4、热销排行
- 热销排行中的商品分类要和排序、分页的商品分类一致。
- 热销排行是查询出指定分类商品销量前二的商品。
- 热销排行使用Ajax实现局部刷新的效果。
- 热销排行会实时变化的,一般会放在redis中,提高读取效率
二、商品列表页显示
- 在首页选中某商种类商品后,就会跳转到该页面
1、商品列表页接口设计和定义
1.1 请求方式
选项 | 方案 |
---|---|
请求方法 | GET |
请求地址 | /list/(?P<category_id>\d+)/(?P<page_num>\d+)/?sort=排序方式 |
# 按照商品创建时间排序
http://www.meiduo.site:8000/list/115/1/?sort=default
# 按照商品价格由低到高排序
http://www.meiduo.site:8000/list/115/1/?sort=price
# 按照商品销量由高到低排序
http://www.meiduo.site:8000/list/115/1/?sort=hot
# 用户随意传排序
http://www.meiduo.site:8000/list/115/1/?sort=juran
1.2 请求参数 : 路径参数 和 查询参数
参数名 | 类型 | 是否必传 | 说明 |
---|---|---|---|
category_id | string | 是 | 商品分类ID,第三级分类 |
page_num | string | 是 | 当前页码 |
sort | string | 否 | 排序方式 |
1.3 响应结果 : HTML
2、后端实现
2.1 后端view实现
# apps/goods/views.py
class GoodsListView(View):
"""商量列表页面"""
def get(self,request,category_id,page_num):
"""提供商品列表页"""
return render(request, 'list.html')
2.2 接口定义
2.2.1 子路由:
# apps/goods/urls.py
from django.urls import path,re_path
from . import views
app_name = 'goods'
urlpatterns = [
# 商品列表页面
re_path(r'^list/(?P<category_id>\d+)/(?P<page_num>\d+)/$', views.GoodsListView.as_view(), name='list')
]
2.2.2 总路由:
- lgshop/urls.spy
3、页面访问: http://127.0.0.1:8000/115/1/?sort=default
三、商品频道分类封装
# apps/contents/utils.py
from collections import OrderedDict
from goods.models import GoodsCategory, GoodsChannel
def get_categories():
# 查询并展示商品分类
categories = OrderedDict()
# 查询所有的商品频道
channels = GoodsChannel.objects.order_by('group_id', 'sequence')
for channel in channels:
# 37个频道 11个组
group_id = channel.group_id
# print(group_id)
if group_id not in categories:
categories[group_id] = {
'channels': [], 'sub_cats': []}
# print(categories)
cat1 = channel.category
categories[group_id]['channels'].append(
{
"id": cat1.id,
"name": cat1.name,
"url": channel.url
}
)
# print(categories) # 打印结果一级分类完成
# 查询二级和三级类别
# 查询二级 parent_id = cat1.id
# for cat2 in cat1.subs.all(): 此行简写代码可替换下面一行代码 models.py中定义了related_name=subs
for cat2 in GoodsCategory.objects.filter(parent_id=cat1.id).all():
cat2.sub_cats = []
categories[group_id]["sub_cats"].append(
{
"id": cat2.id,
"name": cat2.name,
"sub_cats": cat2.sub_cats
}
)
# for cat3 in cat2.subs.all():
for cat3 in GoodsCategory.objects.filter(parent_id=cat2.id).all():
cat2.sub_cats.append(
{
"id": cat3.id,
"name": cat3.name,
}
)
return categories
- 原apps.contents.views.py将改成如下:
from django.shortcuts import render
from django.views import View
from .models import ContentCategory,Content
from .utils import get_categories
class</