Продукты Django не сразу добавляются в корзину
Я пытаюсь создать сайт электронной коммерции на Django, где есть модальная корзина, которая всплывает, когда я пытаюсь добавить любой продукт, нажав кнопку "Добавить в корзину".
В то время как продукт добавляется правильно в бэкенде (что я могу проверить, зайдя в админ-панель), продукт просто не отображается сразу в модале корзины, что необходимо для того, чтобы сайт выглядел хорошо. Только когда я обновляю страницу, продукт появляется в модале. Застрял на этом в течение последних 3 дней, не знаю, что делать. Может ли кто-нибудь помочь мне здесь? Спасибо!
Моя модель корзины:
class Cart(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='cart')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.user.username} - {self.product.name}"
Мой views.py:
Мой urls.py:
urlpatterns = [
path('cart/', views.CartView.as_view(), name='cart'),
path('cart/data/', views.CartView.as_view(), name='cart_data'),
path('cart/update_quantity/', views.CartView.as_view(), name='update_quantity'),
]
Модальная корзина в моем файле base.html:
<div class="list-product px-6">
{% for item in cart_items %}
<div data-item="2" class="item py-5 flex items-center justify-between gap-3 border-b border-line">
<div class="infor flex items-center gap-3 w-full">
<div class="bg-img w-[100px] aspect-square flex-shrink-0 rounded-lg overflow-hidden">
<img style="height: 130px" src="{{ item.product.image.url }}" alt="product" class="w-full h-full">
</div>
<div class="w-full">
<div class="flex items-center justify-between w-full">
<div class="name text-button">{{ item.product.name }}</div>
<div class="remove-cart-btn remove-btn caption1 font-semibold text-red underline cursor-pointer">
Remove
</div>
</div>
<div class="flex items-center justify-between gap-2 mt-3 w-full">
<div class="flex items-center text-secondary2 capitalize">
XS/white
</div>
<div class="product-price text-title">${{ item.product.price }}</div>
</div>
</div>
</div>
</div>
{% endfor %}
Модальная корзина в моем main.js:
Примечание:
Вот мои консольные отладочные заявления:
Product ID from button: 4
main.js:496 Product ID: 4
main.js:514 Product added successfully: {success: true, items: Array(1), subtotal: '597.00'}
main.js:587 Updating cart modal content...
main.js:608 Error fetching cart data: SyntaxError: Unexpected token '<', "
<!DOCTYPE "... is not valid JSON
Вот мои отладочные сообщения в терминале:
Received product_id: 4
Returning updated cart data as JSON response
Отладочные сообщения из метода get_cart_data
в моем представлении корзины не выводятся в терминал.
После "Cart data fetched"
остальная часть подпрограммы выполняется до:
subtotalElement.textContent
При вызове этого фрагмента кода вы видите:
const subtotalElement = document.querySelector('.total-cart');
Веб-движок JavaScript сканирует DOM в поисках Element
с именем класса "total-cart"
. Поскольку такого Element
в DOM в данный момент не существует, результатом сканирования является null
. Отсюда ошибка:
Невозможно установить свойства null (установка 'textContent')
Поскольку Element
не существует и, вероятно, не будет существовать, не полагайтесь на него. Попробуйте альтернативу, например:
const subtotalElement = document.createElement("div");
cartItemsContainer.after(subtotalElement);
В этом варианте в DOM динамически создается фактический Element
, который помещается сразу после уже существующего Element
, чтобы он использовался для отображения повторно найденных данных. Теперь в DOM появятся повторно найденные данные.
Редактирование
Из недавней правки следует, что запрос был для Element
с именем класса "total-price"
, а не "total-cart"
. Поскольку это была простая опечатка, вот столь необходимая незначительная правка кода:
const subtotalElement = document.querySelector('.total-price');
У вас на странице более одного элемента .list-product
.
Используйте более конкретный селектор, как в случае с closeCartIcon
и continueCartIcon
:
//const cartItemsContainer = document.querySelector('.list-product');
const cartItemsContainer = document.querySelector('.modal-cart-main .list-product');