Получение ошибки для AnonymousUser
. То, что я здесь пишу, предназначено только для аутентифицированного пользователя. Но не прошедший проверку подлинности пользователь не может добавить товар.
Я хочу работать так, как если бы пользователь зашел на сайт и нажал кнопку «Добавить в корзину», продукт должен быть добавлен в корзину. Затем, когда он пытается войти. Товары должны быть в корзине.
cart models.py
# Create your models here.
class CartItem(models.Model):
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
item = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
item_total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)
def __str__(self):
return f"{self.quantity} of {self.item.name}"
def pre_save_cart_item(sender, instance, *args, **kwargs):
instance.item_total = instance.quantity * instance.item.price
pre_save.connect(pre_save_cart_item, sender=CartItem)
class Cart(models.Model):
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, related_name='cart')
items = models.ManyToManyField(CartItem)
number_of_items = models.PositiveIntegerField(default=0)
total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
purchased = models.BooleanField(default=False)
def __str__(self):
return f"User: {self.owner}, items in cart {self.number_of_items}"
def m2m_save_cart(sender, action, instance, *args, **kwargs):
if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
instance.number_of_items = instance.items.count()
items = instance.items.all()
instance.total = 0
for x in items:
instance.total += x.item_total
instance.save()
m2m_changed.connect(m2m_save_cart, sender=Cart.items.through)
cart views.py
# Create your views here.
def add_to_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_item, created = CartItem.objects.get_or_create(
item=item,
owner = request.user,
)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
if cart.items.filter(item__slug=item.slug).exists():
cart_item.quantity += 1
cart_item.save()
return redirect('products:product-list')
else:
cart.items.add(cart_item)
return redirect('products:product-list')
else:
cart = Cart.objects.create(
owner=request.user
)
cart.items.add(cart_item)
return redirect('products:product-list')
def remove_from_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
print('cart_qs exists')
if cart.items.filter(item__slug=item.slug).exists():
print('item exists in cart')
cart_item = CartItem.objects.filter(
item = item,
owner = request.user,
)[0]
cart.items.remove(cart_item)
print('removed from cart')
cart_item.delete()
return redirect('products:product-list')
else:
print('item not in cart')
return redirect('')
else:
return redirect('')
print('no cart_qs')
def remove_single_item_from_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
print('cart_qs exists')
if cart.items.filter(item__slug=item.slug).exists():
print('item exists in cart')
cart_item = CartItem.objects.filter(
item = item,
owner = request.user,
)[0]
if cart_item.quantity > 1:
cart_item.quantity -= 1
cart_item.save()
print(item,'quantity decreased')
else:
cart.items.remove(cart_item)
print('removed from cart')
return redirect('products:product-list')
else:
print('item not in cart')
return redirect('products:product-list')
else:
print('no cart_qs')
return redirect('products:product-list')
TRACEBACK
Внутренняя ошибка сервера: / cart / cart / add-to-cart / test-product-1 Трассировка (последний последний вызов):
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ exception.py ", строка 34, во внутреннем ответе = get_response (запрос)
Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ base.py ", строка 115, в _get_response response = self.process_exception_by_middleware (e, request)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ base.py", строка 113, в _get_response response = wrapped_callback (request, * callback_args, * * callback_kwargs)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ src \ carts \ views.py", строка 14, в add_to_cart cart_item, созданный = CartItem.objec ts.get_or_create (
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ manager.py", строка 82, в manager_method вернуть getattr (self.get_queryset (), name) (* args, ** kwargs)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py ", строка 559, в get_or_create возвращает self.get (** kwargs), False
File" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py ", строка 404, в get clone = self._chain (), если self.query.combinator еще self.filter (* args, ** kwargs)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py", строка 904, в фильтре возвращает self. _filter_or_exclude (False, * args, ** kwargs)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query. py ", строка 923, в _filter_or_exclude clone.query.add_q (Q (* args, ** kwargs))
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py", строка 1350, в предложении add_q, _ = self._add_q (q_object, self.used_aliases)
Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query .py ", строка 1377, в _add_q child_clause, required_inner = self.build_filter (
Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py ", строка 1284, в build_filter self.check_related_objects (join_info.final_field, value, join_info.opts)
Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py ", строка 1124, в check_related_objects для v в значении:
Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ utils \ functions.py ", строка 225, во внутреннем потоке возврата c (self._wrapped, * args)
TypeError: Объект AnonymousUser не является t итерируемый [06 / Apr / 2020 16:09:07] "GET / корзина / корзина / добавить в корзину / тест-продукт-1 HTTP / 1.1" 500 116667