Django项目实践(商城):十五、商品列表页面

在这里插入图片描述

(根据居然老师直播课内容整理)

一、商品列表页面分析

在这里插入图片描述

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</
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值