Проблема с увеличением количества в корзине электронной коммерции 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 вызывается корректно, но манипуляции с количеством там, похоже, приводят к неожиданному поведению.
Желаемый результат:
Я ожидаю, что количество товаров в корзине будет увеличиваться или уменьшаться на одну единицу при нажатии соответствующих кнопок. Буду признателен за любые соображения или предложения по решению этой проблемы и обеспечению того, чтобы корректировка количества велась так, как ожидается.
Заранее благодарю вас за помощь! Если потребуются дополнительные разъяснения или фрагменты кода, пожалуйста, дайте мне знать.