Товары Не Добавляются В Корзину Анонимных Пользователей?

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

это мой views.py :

это мой cart.js :

var UpdateBtns= document.getElementsByClassName('update-cart')
for(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,'action',action)

        console.log('USER:',user)
        updateUserOrder(productId,action)
    })
}

function updateUserOrder(productId,action){
    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)
    })
}

это моя страница checkout.html :

у меня проблема с анонимными пользователями, когда анонимный пользователь нажимает "добавить в корзину", и товары не добавляются в корзину

Это очень похоже на проблему, которую сеансы собираются решить для вас. Основная проблема здесь в том, что вы пытаетесь сохранить некоторую информацию для анонимного пользователя, которая является общим объектом для всех пользователей, не прошедших проверку подлинности. Я бы подошел к этому так: использовал сеансы с поддержкой базы данных, сохраняя информацию (содержимое корзины) там, а затем извлекая ее и сохраняя в соответствии с моделью Пользователь / клиент.

https://docs.djangoproject.com/en/5.2/topics/http/sessions/

Кстати, в чем разница между User и Customer? Можно утверждать, что это одно и то же, за исключением того, что у клиента есть история продаж (которая может быть отдельной моделью Sale)

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

Я думаю, что "минималистичный" изменить, чтобы это заработало, - это добавить Customer ссылку на User или на сеанс и, таким образом, выберите один из двух вариантов, в зависимости от ситуации.

Таким образом, это выглядит следующим образом:

from django.conf import settings


class Customer(models.Model):
    user = models.OneToOneField(
        User, on_delete=models.CASCADE, null=True, blank=True
    )
    session_key = models.CharField(
        _('session key'), max_length=40, primary_key=True
    )
    customer_name = models.CharField(max_length=50, null=True)
    customer_email = models.CharField(max_length=100, null=True)

    @classmethod
    def get_customer(cls, request):
        user = request.user
        session_key = request.session.session_key
        if not request.session.exists(session_key):
            request.session.create()
        if user.is_authenticated:
            return Customer.objects.get_or_create(
                user=user, defaults={'session_key': session_key}
            )
        else:
            return Customer.objects.get_or_create(session_key=session_key)

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

def store(request):
    customer = Customer.get_customer(request)
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False
    )
    items = order.orderitem_set.all()
    cartItems = order.get_cart_items
    products = Product.objects.all()
    context = {'products': products, 'cartItems': cartItems}
    return render(request, 'store/store.html', context)


def cart(request):
    customer = Customer.get_customer(request)
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False
    )
    items = order.orderitem_set.all()
    cartItems = order.get_cart_items
    context = {'items': items, 'order': order, 'cartItems': cartItems}
    return render(request, 'store/cart.html', context)


def checkout(request):
    customer = Customer.get_customer(request)
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False
    )
    items = order.orderitem_set.all()
    cartItems = order.get_cart_items
    context = {'items': items, 'order': order, 'cartItems': cartItems}
    return render(request, 'store/checkout.html', context)


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

    customer = Customer.get_customer(request)
    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({'status': 200, 'message': 'Item was added'})


def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)
    customer = Customer.get_customer(request)
    order, created = Order.objects.get_or_create(
        customer=customer, complete=False
    )
    total = float(data['form']['total'])
    order.transaction_id = transaction_id

    if total == order.get_cart_total:
        order.complete = True
    order.save()

    if order.shipping == True:
        ShippingAddress.objects.create(
            customer=customer,
            order=order,
            address=data['shipping']['address'],
            city=data['shipping']['city'],
            state=data['shipping']['state'],
            zipcode=data['shipping']['zipcode'],
        )
    return JsonResponse({'status': 200, 'message': 'Payment submitted..'})
<время работы/>

Примечание: В 2008 году Фил Хаак обнаружил способ получения данных из внешнего массива JSON. Хотя в большинстве браузеров реализованы контрмеры, все же лучше использовать объект JSON в качестве "оболочки" данных. Вот почему JsonResponse [Django-doc] по умолчанию в качестве внешнего объекта допускается только dict. Таким образом, возможно, было бы лучше перенести данные в словарь и оставить safe=True включенным True.

<время работы/>

Примечание: Запрос GET не должен иметь побочных эффектов, следовательно, создание объектов, когда пользователь отправляет запрос GET, не соответствует стандарту HTTP . Поэтому, возможно, было бы лучше превратить это в запрос POST.

<время работы/>

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на пользовательскую модель, чем использовать User model [Django-doc] напрямую. Для получения дополнительной информации вы можете ознакомиться с ссылка на раздел документации User модель.

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