【问题标题】:Django sessions save only one objectDjango 会话只保存一个对象
【发布时间】:2020-02-11 03:15:56
【问题描述】:

我正在建立在线商店并希望使用会话来允许匿名用户在登录之前将商品添加到购物车。 尝试将会话中添加的项目保存为列表,但它只保存添加到列表中的最后一个对象

def cart(request):
    user_id = request.user.id
    cart_items =Cart.objects.all().filter(user_id=user_id, is_ordered=False)


    ids = request.session.get('cart_id')

    if ids:
        for cart_id in ids:
            if request.user.is_authenticated:
                cart = Cart.objects.get(id=cart_id)
                if cart:
                    cart.user = request.user
                    cart.save()


    # get total prices
    prices = []
    for item in cart_items:
        prices.append(item.item.price * item.qty)
    total_price = sum(prices)
    context = {
        'items': cart_items,
        'total_price': total_price
    }
    request.session['prices'] = prices


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

def add_to_cart(请求):

if request.user.is_authenticated:
    item = Item.objects.get(pk=request.POST['item_id'])
    cart = Cart.objects.filter(
    user=request.user, item=item, is_ordered=False).first()
    if cart:
        cart.qty += 1
        cart.save()
        messages.success(request, 'item added to cart!')
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    else:
        cart = Cart(user=request.user, item=item)
        cart.save()
        messages.success(request, 'item added to cart!')
else:
    carts_ids = []
    session_cart = request.session.get('cart_id')
    item = Item.objects.get(pk=request.POST['item_id'])
    if session_cart :  
        for cart in session_cart:
            carts = Cart.objects.all().filter(id=cart, item=item)
            if carts:
                cart = carts.filter(item=item)[0]
                print(cart.qty)
                cart.qty += 1
                cart.save()
            else:
                print('new cart')
                new_cart = Cart(item=item)
                new_cart.save()
                carts_ids.append(new_cart.id)
                request.session['cart_id'] = carts_ids
    else:
        print('new session')
        new_cart = Cart(item=item)
        new_cart.save()
        carts_ids.append(new_cart.id)
        request.session['cart_id'] = carts_ids

return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

这是我的models.py 以及 github 上的完整代码,我现在只处理这些视图(购物车和 add_to_cart)

申请任何帮助来克服这个问题并简化我的代码:)

【问题讨论】:

    标签: django session


    【解决方案1】:

    您的想法是将整个购物车保存在会话中,以便在同一用户返回您的网站时重新加载它。所以你的代码应该是这样的:

    prices = []
    itemlist=[]
    for item in cart_items:
        prices.append(item.item.price * item.qty)
        itemlist.append(item.item, item.qty)
    total_price = sum(prices)
    context = {
        'items': cart_items,
        'total_price': total_price
    }
    request.session['items'] = itemlist
    

    结束,那么你还需要读出这份清单。

    【讨论】:

    • 在我的数据库上,我正在为每个项目创建一个新的购物车(我知道这很糟糕),我需要在会话中保留这些购物车 ID 的列表,以便我可以将这些购物车保存给用户他登录,它正在工作,但仅适用于购物车(项目)你可以在这里看到我的模型github.com/ma7aziz/dummypharmacy/blob/master/cart/models.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2021-01-10
    • 2013-07-09
    • 2015-06-12
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多