本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习

https://www.bilibili.com/video/BV1vt41147K8?p=1

编辑视图view.py

导入模型类,通过objects.all()方法获取需要展示的信息

# 获取数据库信息
# 获取商品分类
goods_type = GoodsType.objects.all()
# 获取轮播商品
goods_banner = IndexGoodsBanner.objects.all()
# 获取活动信息
promotion_banner = IndexPromotionBanner.objects.all()

注意在显示分类商品列表时,这是一个主从(头行)关系结构(下图红框为主,蓝框为从),需要两层遍历,第一层遍历商品类别,在第一层中再遍历每个商品类别下面的具体商品SKU,且在第二层中商品分为了展示(display_type)两类,一类为显示文字(display_type=0),一类为显示图片(display_type=1)

但是在模板文件中第一层循环比较好写{% for type in goods_type %},但是在写第二层{% for goods in goods_list %}时,这个goods_list不好接受上层传过来的具体goods_type的值,所以第二层循环不好直接在模板文件中写,这里的处理思路就是,将第二层的goods_list当做第一层type对象的属性,这样就能够将具体的type和其下面的goods绑定起来,在模板中的写法就是:

{% for type in goods_type %}
<div>
{% for goods in type.goods%}
<li>....</li>
<% endfor %>
</div>
{% endfor%}

所以在view.py中需要给type添加两个属性,一个是title_banner只显示文字,一个是image_banner显示图片

# 获取分类商品展示信息
for goodstype in goods_type:
# 获取该类型下面的商品的标题信息,并进行排序
title_banner = IndexTypeGoodsBanner.objects.filter(goodstype=goodstype, display_type=0).order_by('index')
# 获取该类型下面的商品的图片信息,并进行排序
image_banner = IndexTypeGoodsBanner.objects.filter(goodstype=goodstype, display_type=1).order_by('index')
# 动态给type增加属性,分别保存首页分类商品的文字信息和图片信息
goodstype.title_banner = title_banner
goodstype.image_banner = image_banner

 # 获取购物车数量,购物车存储格式为:cart_userid : {'goodsid': quantity}
 cart_count = get_cart_count(request)
 # 上下文
 context = {
    'goods_type': goods_type,
    'goods_banner': goods_banner,
    'promotion_banner': promotion_banner,
    'cart_count': cart_count
 }
 return render(request, self.template_name, context)

编辑index.html

商品类型展示块的写法如下:

{% for type in goods_type %}
<div class="list_model">
<div class="list_title clearfix">
<h3 class="fl" id="model{{ forloop.counter }}">{{ type.name }}</h3>
<div class="subtitle fl">
<span>|</span>
{% for title in type.title_banner %}
<a href="#">{{ title.goods.name }}</a>
{% endfor %}
</div>
<a href="#" class="goods_more fr" id="fruit_more">查看更多 ></a>
</div> <div class="goods_con clearfix">
<div class="goods_banner fl"><img src="{{ type.image.url }}"></div>
<ul class="goods_list fl">
{% for image in type.image_banner %}
<li>
<h4><a href="#">{{ image.goods.name }}</a></h4>
<a href="#"><img src="{{ image.goods.image.url }}"></a>
<div class="prize">¥ {{ image.goods.price }}</div>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endfor %}

获取购物车信息

存储位置

因为购物车的信息是用户mysql随时可以随意新增和修改的,增删改查操作频率很高,且存储结构并不复杂,因此不适合实时存储在关系型数据库mysql中,可以存在内存型数据库中,如redis

存储的格式

因为需要存储的信息只有goods_id和数量两个字段,因此采用hash类型最为适合,key为cart_userid,filed为goods_id,value为数量,即:cart_userid: {'goods_id', quantity}

获取购物车数量

这里获取的是商品的id数有多少个,即hash中有多少个元素,因为获取购物车数量的方法在多个视图中都需要调用,因此将其定义在一个公用包utils.py中

touch utils/utils.py

新增获取购物车数量方法get_cart_count

from django_redis import get_redis_connection

def get_cart_count(request):
'''获取用户购物车数量'''
# 获取购物车数据,购物车存储格式为:cart_userid : {'goodsid': quantity}
# 初始化购物车数量
cart_count = 0
# 判断是否登录
user = request.user
if user.is_authenticated:
# 连接redis数据库
connect = get_redis_connection('default')
# 构造key
cart_key = 'cart_%d'%(user.id)
# 获取hash中元素的个数
cart_count = connect.hlen(cart_key)
return cart_count

在goods/view.py中调用

from utils.utils import get_cart_count

def get(self, request):
  ......
  # 获取购物车数量,购物车存储格式为:cart_userid : {'goodsid': quantity}
  cart_count = get_cart_count(request)
  ......

DJANGO-天天生鲜项目从0到1-006-首页-内容展示的更多相关文章

  1. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  2. DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. python 天天生鲜项目

    python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...

  4. Django之天天生鲜项目

    准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...

  5. DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  6. DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

随机推荐

  1. 计算机网络之HTTPS协议

    • HTTPS协议是以安全为目的的HTTP通道,比单纯的HTTP协议更安全,相当于HTTP的升级版.• HTTPS的安全基础为SSL,就是在HTTP下加入SSL层,意思是HTTPS通过安全传输机制进行 ...

  2. Python实用笔记 (18)面向对象编程——类和实例

    类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各 ...

  3. django admin 添加用户出现外键约束错误

    今天在做mxonline项目时,注册了用户表进admin后,想在后台添加一个用户试试,结果出现了错误,经过一番搜索发现以下两个解决方法,不过我只用了一种 报错信息: IntegrityError: ( ...

  4. 化繁就简,如何利用Spring AOP快速实现系统日志

    1.引言 有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了. 为什么要用Spring AOP呢?少写代码.专注自身业务逻辑实现(关注本身的业务 ...

  5. idea2020.1.2破解,亲测可行,激活至2089年!

    一.下载最新版IDEA2020安装包 官网:https://www.jetbrains.com/idea/download/ 旧版:https://www.jetbrains.com/idea/dow ...

  6. rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例

    下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...

  7. [POJ3613] Cow Relays(Floyd+矩阵快速幂)

    解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...

  8. Mac OS下安装mysqlclient遇到的一些坑

    在玩django的同时,必须需要mysqlclient和pillow包,想在本地Mac上装上mysqlclient,但着实遇到不少坑,最终还是在github issue中找到了解决方法,这里记录一下, ...

  9. Windows系统appium移动端自动化真机环境搭建

    appium-windows-android环境搭建完成以后,就可以进行真机模式下的appium环境搭建啦!! 准备:把要测试的app下载至本机(小波的是把apk放在桌面上,例如:C:\Users\w ...

  10. 线下---复习day03

    目录 django回顾 1 web应用,http协议,web框架 2 django请求生命周期 3 路由控制 4 视图层 5 模板层 6 模型层 django回顾 1 web应用,http协议,web ...