Проблема с увеличением количества в корзине электронной коммерции Django

Описание:

Я столкнулся с неожиданным поведением моего сайта электронной коммерции на Django, когда количество товаров в корзине увеличивается не линейно, а экспоненциально. Вот описание проблемы и соответствующие фрагменты кода:

Описание проблемы:

При добавлении товара в корзину количество увеличивается вдвое при каждом нажатии кнопки "добавить". Например, если я добавляю товар один раз, он показывает количество 3 вместо 1. Затем, когда я добавляю его снова, количество подскакивает до 6 вместо 2, и так далее. Аналогично, при уменьшении количества с помощью кнопки "Удалить" оно не уменьшается линейно, а демонстрирует похожее экспоненциальное поведение.

Сниппеты кода:

cart.html: В этом фрагменте показан HTML-код, отвечающий за отображение количества и кнопок добавления или удаления товаров из корзины.

<div class="li-cartstyle cartbodyinformation-quantity">
<p class="quantity-input">{{ item.quantity }}</p>
<div class="cartquantity-buttons">
    <i data-product={{ item.product.id }} data-action="add" class="update-cart change-quantity fa-solid fa-angle-up"></i>
    <i data-product={{ item.product.id }} data-action="remove" class="update-cart change-quantity fa-solid fa-angle-down"></i>
</div>

cart.js: Этот код JavaScript обрабатывает взаимодействие с корзиной, например, добавление или удаление товаров.

        // var user = '{{request.user}}'

    var updateBtns = document.getElementsByClassName('update-cart')

    var user = isAuthenticated ? 'AuthenticatedUser' : 'AnonymousUser';

    for(var i=0; i < updateBtns.length; i++){
        updateBtns[i].addEventListener('click', function(){
            var productId = this.dataset.product
            var action = this.dataset.action
            console.log('productId:', productId, '\naction: ', action)

            console.log('USER: ',user)

            if(user === 'AnonymousUser'){
                addCookieItem(productId, action)
            }
            else{
                updateUserOrder(productId, action)
            }
        })
    }

    function addCookieItem(productId, action){
        console.log('Not Logged in')

        if (action == 'add'){
            if (cart[productId] == undefined){
                cart[productId] = {'quantity': 1}
            }
            else {
                cart[productId]['quantity'] += 1
            }
        }

        if (action == 'remove'){
            cart[productId]['quantity'] -= 1

            if (cart[productId]['quantity'] <= 0){
                console.log('Remove Item')
                delete cart[productId]
            }
        }

        console.log('Cart:', cart)
        document.cookie = 'cart=' + JSON.stringify(cart) + ";domain=;path=/"
        location.reload()
    }


    function updateUserOrder(productId, action){
        console.log('User is logged in, sending data..')

        var url = '/update_item/'

        fetch(url, {
            method:'POST',
            headers:{
                'Content-Type':'application/json',
                'X-CSRFToken': csrftoken,
            },
            body:JSON.stringify({'productId': productId, 'action': action  })
        })

        .then((response) => {
            return response.json()
        })

        .then((data) => {
            console.log('data:', data)
            location.reload()
        })
    }

views.py: Этот Python-код содержит логику бэкенда для обновления элементов корзины.

def updateItem(request):
data = json.loads(request.body)
productId = data['productId']
action = data['action']

print('Action:', action)
print('productId:', productId)


customer = request.user.customer
product = Product.objects.get(id=productId)
order, created = Order.objects.get_or_create(customer=customer, complete=False)

orderItem, created = OrderItem.objects.get_or_create(order=order, product=product)

if action == 'add':
    orderItem.quantity = (orderItem.quantity + 1)
elif action == 'remove':
    orderItem.quantity = (orderItem.quantity - 1)

orderItem.save()

if orderItem.quantity <= 0:
    orderItem.delete()

return JsonResponse('Item was added', safe=False)

Дополнительный контекст:

Сайт построен с использованием фреймворка Django. Проблема, похоже, сохраняется независимо от того, аутентифицирован пользователь или нет. Проанализировав сетевые запросы, я заметил, что представление updateItem в views.py вызывается корректно, но манипуляции с количеством там, похоже, приводят к неожиданному поведению.

Желаемый результат:

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

Заранее благодарю вас за помощь! Если потребуются дополнительные разъяснения или фрагменты кода, пожалуйста, дайте мне знать.

Вернуться на верх