Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django实战-生鲜电商-用户中心|商品详情

Django实战-生鲜电商-用户中心|商品详情

作者头像
小团子
发布于 2019-07-18 08:05:49
发布于 2019-07-18 08:05:49
68400
代码可运行
举报
文章被收录于专栏:数据云团数据云团
运行总次数:0
代码可运行

完成了项目的模型层,最需要思考的是数据库该如何设计?这次的电商项目,从用户到下单,都会有哪些操作呢?当看到页面的那些商品信息或是活动促销信息,有考虑过它们之间的联系么?要是,商品的分类要像某宝或是某东,那样有二级和三级分类,这样又该怎么处理呢?如果每个功能的数据表都单独设计成和用户关联,那功能的不断扩展,会不会影响到整个数据库读写与查询呢?

完成了前一小节的主页,需要对商品详情页单独写一个视图类。会发现,在主页的视图和商品详情页视图中,都会先从缓存中去查询有无数据。

一、商品详情页

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django_redis import get_redis_connection

django_redis 在 settings.py 文件中配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/5",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DetailView(BaseCartView):
    """商品详细信息页面"""
    def get(self, request, sku_id):
        # 尝试获取缓存数据
        context = cache.get("detail_%s" % sku_id)
        # 如果缓存不存在
        if context is None:
            try:
                # 获取商品信息
                sku = GoodsSKU.objects.get(id=sku_id)
            except GoodsSKU.DoesNotExist:
                # from django.http import Http404
                # raise Http404("商品不存在!")
                return redirect(reverse("goods:index"))

            # 获取类别
            categorys = GoodsCategory.objects.all()

            # 从订单中获取评论信息
            sku_orders = sku.ordergoods_set.all().order_by('-create_time')[:30]
            if sku_orders:
                for sku_order in sku_orders:
                    sku_order.ctime = sku_order.create_time.strftime('%Y-%m-%d %H:%M:%S')
                    sku_order.username = sku_order.order.user.username
            else:
                sku_orders = []

            # 获取最新推荐
            new_skus = GoodsSKU.objects.filter(category=sku.category).order_by("-create_time")[:2]

            # 获取其他规格的商品
            goods_skus = sku.goods.goodssku_set.exclude(id=sku_id)

            context = {
                "categorys": categorys,
                "sku": sku,
                "orders": sku_orders,
                "new_skus": new_skus,
                "goods_skus": goods_skus
            }

            # 设置缓存
            cache.set("detail_%s" % sku_id, context, 3600)

        # 购物车数量
        cart_num = self.get_cart_num(request)

        # 浏览记录
        # 如果是登录的用户
        if request.user.is_authenticated():
            redis_conn = get_redis_connection("default")
            user_id = request.user.id
            # 移除已经存在的本商品浏览记录
            redis_conn.lrem("history_%s" % user_id, 0, sku_id)
            # 添加新的浏览记录
            redis_conn.lpush("history_%s" % user_id, sku_id)
            # 只保存最多5条记录
            redis_conn.ltrim("history_%s" % user_id, 0, 4)

        context.update({"cart_num": cart_num})

        return render(request, 'detail.html', context)

二、用户中心

在用户进入个人中心之前都需要先验证用户是否登录,在很多地方都会需要用到登录验证,比如下单、支付、填写地址。所以最好将验证登录作为一个可继承的 mixin 类,这样在其它需要登录验证的视图中就可以直接继承。

① 验证用户的登录状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LoginRequiredMixin(object):
    """验证用户的登录状态"""
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        return login_required(view)

② 用户中心

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserInfoView(LoginRequiredMixin, View):
    """用户中心"""
    def get(self, request):
        user = request.user

        try:
            address = user.address_set.latest("create_time")
        except Address.DoesNotExist:
            # 如果地址信息不存在
            address = None

        # 从django_redis中拿到一个与redis的连接对象
        redis_conn = get_redis_connection("default")

        # 从redis中查询用户的历史记录信息
        sku_ids = redis_conn.lrange("history_%s" % user.id, 0, 4)

        # sku_ids = [5,6,3,9,1]

        # 从数据库中查询商品的信息
        # select * from goods_sku where id in ()
        # skus = GoodsSKU.objects.filter(id__in=sku_ids)

        skus = []
        for sku_id in sku_ids:  # [5,6,3,9,1]
            sku = GoodsSKU.objects.get(id=sku_id)
            skus.append(sku)

        # 形成模板所用的变量,渲染模板
        context = {
            "address": address,
            "skus": skus   # [5,6,3,9,1]
        }
        return render(request, "user_center_info.html", context)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django实战-生鲜电商-用户地址|订单确认
在完成登录到用户提交订单,这一系列的类视图函数,会发现有大量的数据读写操作,像电商这类的项目,更多的是用户在浏览页面的次数比较多,所以在数据查询的场景中都会采用缓存,将用户第一次打开页面,到下一次重新浏览,这其间就可以提升用户打开页面的速度。
小团子
2019/07/18
6640
Django实战-生鲜电商-用户地址|订单确认
Django实战-生鲜电商-主页|商品
前面一小节完成了对登录、注册、激活的视图,需要注意的是,在逻辑处理上需要明确是采用何种方式实现浏览器的登录状态保存。
小团子
2019/07/18
5890
Django实战-生鲜电商-主页|商品
Django实战-生鲜电商-购物车信息
在上一小节中,会发现加入购物车,如果用户未登录,是将添加到购物车的商品存储在浏览器的 cookie 中;如果用户已登录,则保存购物车数据到redis中,然后是返回处理结果。
小团子
2019/07/18
5160
Django实战-生鲜电商-购物车信息
Django实战-生鲜电商-提交订单
在完成了前一小节的数据库事务,提交订单的视图类就可以直接继承 mixin 类。 ① 创建事务保存点 # 创建事务保存点 save_id = transaction.savepoint(
小团子
2019/07/18
6190
Django实战-生鲜电商-提交订单
【愚公系列】2022年01月 Django商城项目 29-商品浏览历史记录功能实现
思路: 用户每次浏览商品时, 向后台发送请求, 携带商品ID, 然后在 Redis中存储: 用户ID和浏览的商品ID,以时间排序. 来实现存储用户浏览历史记录. 其比较复杂的是redis选用数据结构(有序Set)
愚公搬代码
2022/02/03
5600
【愚公系列】2022年01月 Django商城项目 29-商品浏览历史记录功能实现
Django实战-生鲜电商-删除购物车数据|退出
经过前两小节的了解,也知道了购物车的商品数据可以保存在 cookie 和 redis 中。同样是先要获取到商品的id,再到用户的购物车中查询到这条数据。会发现,存入到 cookie 的商品数据是 json 数据格式。
小团子
2019/07/18
7510
Django实战-生鲜电商-删除购物车数据|退出
用户浏览历史记录_微博怎么看最近浏览过的用户
历史记录只需保存多个商品的sku_id即可,而且需要保持添加sku_id的顺序,所以采用redis中的列表来保存,redis的数据存储设计
全栈程序员站长
2022/09/20
6790
Django实战-生鲜电商-加入购物车
用户在进入个人中心前,都需要判断用户是否登录。在加入购物车之前,判断商品是否存在。如果用户已登录,则保存购物车数据到redis中;操作redis,保存购物车数据,"cart_用户id": {"sku_1": 10, "sku_2": 11},先尝试从用户的购物车中获取这个商品的数量;如果购物车中不存在这个商品,则直接添加购物车记录,否则,需要进行数量的累计,再添加到购物车记录中。
小团子
2019/07/18
7630
Django实战-生鲜电商-加入购物车
Django实战-生鲜电商-更新购物车数据
同样,用户更新购物车信息,需要判断商品是否存在,如果用户未登录,将商品数据保存在 cookie 中;如果用户已登录,将获取的更新数据保存在 redis 中。
小团子
2019/07/18
7000
Django实战-生鲜电商-更新购物车数据
Django实战-生鲜电商-订单评论
经过几轮的视图类的编写,整个电商项目的逻辑有清晰一点了么?对于事务逻辑的数据处理,分为查询和创建。相对于本项目来说,创建的操作大多数在用户下单到支付成功这一过程,所以在提交订单的类中,用到了数据库事务,对数据的一致性处理提供了保障。
小团子
2019/07/18
5110
Django实战-生鲜电商-订单评论
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
文章目录 一、订单页面设计 1.HTML 2.JS 3.后端业务逻辑 二、页面效果 一、订单页面设计 1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http
愚公搬代码
2022/02/05
4410
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
Django实战-生鲜电商-登录|注册|激活
完成了模型层,需要映射到数据库中,创建相应的表。在项目的 settings.py 文件中配置数据库,Django 有数据读写分离的配置方式。
小团子
2019/07/18
1.4K0
Django实战-生鲜电商-登录|注册|激活
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
文章目录 一、订单确认功能实现 1.后台处理逻辑 2.JS 二、订单支付成功页面 1.后台逻辑 2.页面设计 3.实际效果 一、订单确认功能实现 1.后台处理逻辑 class OrderView(LoginRequiredJSONMixin,View): def post(self,request): # 这里省略了很多操作,这些操作不需要事务 # 1.订单信息 # 1.1 获取用户信息 user = request.u
愚公搬代码
2022/02/07
4930
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
【愚公系列】2022年01月 Django商城项目 30-购物车功能实现
文章目录 一、添加购物车 1.后端逻辑代码 2.前台请求接口代码 3.实际效果 二、获取购物车 1.后端逻辑代码 2.前台页面代码 3.实际效果 三、更新购物车 1.后端逻辑代码 2.前台页面代码 3.实际效果 四、删除购物车 1.后端逻辑代码 2.前台页面代码 五、合并购物车 一、添加购物车 1.后端逻辑代码 """ 一 前后端需求分析需求 前端需要收集: 商品id,商品数量, 选中是可选的(默认就是选中) 如果用户登陆了则请求携带session id
愚公搬代码
2022/02/04
5890
【愚公系列】2022年01月 Django商城项目 30-购物车功能实现
Django实战-生鲜电商-路由
在项目的主目录 urls.py 文件中,配置 用户、商品、订单、购物车的主路由。 from django.conf.urls import include, url from django.contr
小团子
2019/07/18
4440
Django实战-生鲜电商-路由
美多商城项目(七)
If you can change your mind, you can change your life.
小闫同学啊
2019/07/18
2K0
美多商城项目(七)
Django实战-生鲜电商-模型层
经过前几小节的介绍,ORM 的基础应用,如何把一张数据表建好,方便各张表之间的数据处理。从第一张用户表开始,就意味着整个站点的数据表能有多大的扩展能力。
小团子
2019/07/18
5800
Django实战-生鲜电商-模型层
【愚公系列】2022年01月 Django商城项目 27-商品详情页功能实现
文章目录 一、商品详情页功能实现 1.后台查询代码 二、详情页面展示 1.前台html代码 2.实际效果 三、包装、规格、售后页面展示 1.前台html代码 2.实际效果 四、404页面 1.前台html代码 2.实际效果 一、商品详情页功能实现 1.后台查询代码 class DetailView(View): def get(self,request,sku_id): # 获取当前sku的信息 try: sku = SKU.objects
愚公搬代码
2022/02/02
3930
【愚公系列】2022年01月 Django商城项目 27-商品详情页功能实现
Django REST framework+Vue 打造生鲜超市(十二) 十三、首页、商品数量、缓存和限速功能开发
十三、首页、商品数量、缓存和限速功能开发  13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地  (1)goods/serializer class BannerSerializer(serializers.ModelSerializer): ''' 轮播图 ''' class Meta: model = Banner fields = "__all__" (2)goods/views.py c
zhang_derek
2018/04/23
2K0
Django REST framework+Vue 打造生鲜超市(十二)
		十三、首页、商品数量、缓存和限速功能开发
Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
Github和Gitee代码同步更新: https://github.com/PythonWebProject/Django_Fresh_Ecommerce; https://gitee.com/Python_Web_Project/Django_Fresh_Ecommerce。
cutercorley
2020/08/05
2.2K0
Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
推荐阅读
相关推荐
Django实战-生鲜电商-用户地址|订单确认
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验