day53-天天生鲜项目购物车结算页面数据同步

1购物车中商品删除功能

页面重新刷新
location.href = '/cart/cart/'
页面重新加载
location.reload()

<a  onclick="del_cart({{ goods.0.id }})">删除</a>
function del_cart(id) {
        var csrf = $('input[name="csrfmiddlewaretoken"]').val()
        $.ajax({
            url:'/cart/del_cart/' + id + '/',
            type:'POST',
            headers:{'X-CSRFToken':csrf},
            dataType:'json',
            success:function (data) {
                删除标签
                var nodeGoods = $('#goods_'+ id)
                nodeGoods.remove()
                cart_price()
            },
            error:function (data) {
                alert('删除失败')
            }
        })
    }

视图层删除函数

    def del_cart(request, id):
    if request.method == 'POST':
         在session中删除购物车中删除的某个商品
        session_goods = request.session.get('goods')
        for re_goods in session_goods:
            if re_goods[0] == id:
                session_goods.remove(re_goods)
                break
        request.session['goods'] = session_goods
         删除数据库中对应的session中被删除的数据
        user_id = request.session.get('user_id')
        if user_id:
            ShoppingCart.objects.filter(goods_id=id, user_id=user_id).delete()
        return JsonResponse({'code': 200, 'msg': '请求成功'})

2中间件登陆校验

主要区分哪些网址需要校验,哪些不需要校验,在需要校验的强制其跳转到登陆界面进行登陆

class LoggingMiddleware(MiddlewareMixin):
    def process_request(self, request):
        user_id = request.session.get('user_id')
        path = request.path
        不需要做登陆校验的地址
        not_need_check = ['/user/register/', '/user/login/', '/goods/index/',
                          'goods/detail/.*', '/cart/.*']
        for check_path in not_need_check:
            if re.match(check_path, path):
          当前path路径为不需要做登陆校验的路由,则直接访问对应页面
                return None
        if not user_id:
      当前path路径为不需要做登陆校验的路由,则直接访问对应页面
           return HttpResponseRedirect(reverse('user:login'))

3中间件同步数据库与session中的数据

class SessionToMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        同步session中的商品信息和数据库中购物车表的商品信息
        1.判断用户是否登陆,登陆才做数据同步操作
        user_id = request.session.get('user_id')
        if user_id:
             2.同步
            2.1判断session中的商品是否存在于数据库中,如果存在,则更新
             2.2如果不存在,则创建
           2.3同步数据库的数据到session中
            session_goods = request.session.get('goods')
            if session_goods:
                 将session中的数据同步到数据库
                for se_goods in session_goods:
                    # se_goods结构为[goods_id,num,is_select]
                    cart = ShoppingCart.objects.filter(user_id=user_id, goods_id=se_goods[0]).first()
                    if cart:
                         更新商品信息
                        if cart.nums != se_goods[1] or cart.is_select != se_goods[2]:
                            cart.nums = se_goods[1]
                            cart.is_select = se_goods[2]
                            cart.save()
                    else:
                        创建
                        ShoppingCart.objects.create(user_id=user_id, goods_id=se_goods[0],
                                                    nums=se_goods[1], is_select=se_goods[2])
            同步数据库的数据到session中
            db_carts=ShoppingCart.objects.filter(user_id=user_id)
            组装多个商品格式:[[goods_id,num,is_select],[goods_id,num,is_select]]
            if db_carts:
                new_session_goods = [[cart.goods_id, cart.nums, cart.is_select] for cart in db_carts]
                request.session['goods'] = new_session_goods
        return response

4商品结算总价及小计

cart.goods_price = price;给cart添加一个小计的属性并赋值

def place_order(request):
    if request.method == 'GET':
        获取当前登陆系统的用户对象
        user = request.user
        carts = ShoppingCart.objects.filter(user=user, is_select=True).all()
        计算小计和总价
        total_price = 0
        for cart in carts:
             小计金额
            price = cart.goods.shop_price * cart.nums
            给cart添加一个小计的属性并赋值
            cart.goods_price = price
            总金额
            total_price += price
        return render(request, 'place_order.html', {'carts': carts, 'total_price': total_price, 'num': len(carts)})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容