Товары Не Добавляются В Корзину Анонимных Пользователей?
я хочу, чтобы пользователи, не вошедшие в систему, могли добавлять товары в свою корзину, но когда я нажимаю "добавить в корзину", товар в корзину не добавляется
это мой 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
модель.