Django сеансов сохраняют только один объект - PullRequest
0 голосов
/ 10 февраля 2020

Я создаю интернет-магазин и хочу использовать сеансы, чтобы анонимные пользователи могли добавлять товары в корзины перед входом в систему. пытается сохранить добавленные элементы в сеансе как список, но при этом сохраняется только последний добавленный в список объект

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, над которым я сейчас работаю только над этими представлениями (cart и add_to_cart)

оцените любую помощь, чтобы преодолеть это и упростить мой код:)

1 Ответ

0 голосов
/ 10 февраля 2020

Идея заключается в том, что вы сохраняете всю корзину в сеансах, чтобы вы могли перезагрузить ее, когда тот же пользователь вернется на ваш сайт. Итак, ваш код должен выглядеть следующим образом:

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

Конец, тогда вам также нужно будет прочитать этот список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...